费了好大劲才算是理解了,现在才明白,这不算是一个难题,
按我自己的理解,有点像模拟,按照树的定义我可以把这个数组转换为
{1,0,7,8,9
2,0,6,0,8
3,4,5,6,7
4,0,0,0,8
5,6,7,0,9
}
就是从第一层走到最后一层;
用结构体存储它的下标和层数;
用一个变量front存储目前所在层数
#include<stdio.h>
#include<string.h>
struct pos
{
int x,y,z;
} Q[50];
int v[4][2]= {1,0,-1,0,0,1,0,-1};
void print(int v)
{
if(v!=-1)
{
print(Q[v].z);
printf("(%d, %d)\n",Q[v].x,Q[v].y);
}
}
void dfs(int a[5][5])
{
Q[0].x=Q[0].y=0;
Q[0].z=-1;
int front=0,rear=1;
while(front<rear)
{
if(Q[front].x==4&&Q[front].y==4)
{
print(front);
return ;
}
for(int i=0; i<4; i++)
{
int x1=Q[front].x+v[i][0];
int y1=Q[front].y+v[i][1];
if(x1>=0&&x1<5&&y1>=0&&y1<5&&!a[x1][y1])
{
a[x1][y1]=1;
Q[rear].x=x1;
Q[rear].y=y1;
Q[rear].z=front;
rear++;
}
}
front++;
}
}
int main()
{
int i,j,a[5][5];
for(i=0; i<5; i++)
for(j=0; j<5; j++)
scanf("%d",&a[i][j]);
dfs(a);
return 0;
}