Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 7

#include <stdio.

h>
#include <string.h>
#include <math.h>
#define MAXR 40
#define MAXC 40
struct STACK
{
int x;
int y;
}stk[MAXR*MAXC];

int stk_N=0;

void push(int x,int y)
{
stk[stk_N].x=x;
stk[stk_N].y=y;
stk_N++;
}
void pop(int *x,int *y)
{
stk_N--;
*x=stk[stk_N].x;
*y=stk[stk_N].y;
}

struct NODE
{
int visited;
int distance;
int visitedfrom_x;
int visitedfrom_y;
}node[MAXR][MAXC];

void init_dfs(int r,int c)
{
int i,j;
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
node[i][j].visited=0;
node[i][j].distance=0;
}
}

}


struct NODES_EXPLORED
{
int x;
int y;
}nodes_explored[MAXR*MAXC];
int n_nodes_explored=0;

void insert_node(int to_x,int to_y,int from_x,int from_y,int r,int c, char grid[r][c])
{

if(to_x>=0 && to_x<r && to_y>=0 && to_y<c && node[to_x][to_y].visited==0 &&
grid[to_x][to_y]!='%')
{
node[to_x][to_y].visited=1;
node[to_x][to_y].distance=node[from_x][from_y].distance+1;
node[to_x][to_y].visitedfrom_x=from_x;
node[to_x][to_y].visitedfrom_y=from_y;
push(to_x,to_y);
}
}


void displaygrid(int x,int y,int r,int c,char grid[r][c])
{
int i,j;
grid[x][y]='*';
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
printf("%c",grid[i][j]);
printf("\n");
}
printf("\n");
}

void dfs(int r, int c, int pacman_r, int pacman_c, int food_r, int food_c, char grid[r][c])
{
//logic here
int i,j;
int x,y;
int found=0;
init_dfs(r,c);

push(pacman_r,pacman_c);
node[pacman_r][pacman_c].visited=1;


while(stk_N>0&&!found)
{
pop(&x,&y);

//TO KEEP TRACK OF EXPLORED NODES
nodes_explored[n_nodes_explored].x=x;
nodes_explored[n_nodes_explored].y=y;
n_nodes_explored++;
//END


if(x==food_r&&y==food_c)
{
found=1;
break;
}

insert_node(x-1,y,x,y,r,c,grid);
insert_node(x,y-1,x,y,r,c,grid);
insert_node(x,y+1,x,y,r,c,grid);
insert_node(x+1,y,x,y,r,c,grid);

}

/*PRINT THE NODES EXPLORED IN ORDER OF EXPLORATION*/

printf("%d\n",n_nodes_explored);
for(i=0;i<n_nodes_explored;i++)
printf("%d %d\n",nodes_explored[i].x,nodes_explored[i].y);


/*PRINT THE PATH FROM PACMAN TO FOOD*/
int arr_x[MAXR*MAXC],arr_y[MAXR*MAXC];
int n_arr=0;
int next_x,next_y;
int curr_x,curr_y;

curr_x=food_r;
curr_y=food_c;

while(curr_x!=pacman_r||curr_y!=pacman_c)
{
arr_x[n_arr]=curr_x;
arr_y[n_arr]=curr_y;
//displaygrid(curr_x,curr_y,r,c,grid);
//printf("%d %d\n",curr_x,curr_y);
n_arr++;
next_x=node[curr_x][curr_y].visitedfrom_x;
next_y=node[curr_x][curr_y].visitedfrom_y;
curr_x=next_x;
curr_y=next_y;
}
arr_x[n_arr]=curr_x;
arr_y[n_arr]=curr_y;
n_arr++;

printf("%d\n",n_arr-1);
for(i=n_arr-1;i>=0;i--)
printf("%d %d\n",arr_x[i],arr_y[i]);

}

int main(void) {

int r, c;
int pacman_r, pacman_c;
int food_r, food_c;
int i;
scanf( "%d %d", &pacman_r, &pacman_c);
scanf( "%d %d", &food_r, &food_c);
scanf( "%d %d", &r, &c);
char grid[r][c];

for(i=0; i<r; i++) {
scanf("%s[^\\n]%*c", grid[i]);
}
dfs( r, c, pacman_r, pacman_c, food_r, food_c, grid);
return 0;
}

You might also like