顶嵌杯决赛第二题,简单的bfs,关键是gcc不能用stl,所以得自己写一个队列。

已注释:

#include <stdio.h>
#include <stdlib.h>
int mm[5][5];
int dir[4][2]={ {0,1},{0,-1},{1,0},{-1,0}};

typedef struct
{
int x,y;//坐标
int pre;//前一节点
}node ;

node que[10005];
int vs[5][5];//标记已访问


int judge(node a)
{
if(a.x<0||a.y<0||a.x>=5||a.y>=5)return 0; //越界返回0
if(mm[a.x][a.y]==1)return 0;//墙
return 1;
}


void dfs(node a)//这个其实是输出输出函数
{
if(a.pre==-1)return ;//结束条件(找到原点)
else dfs(que[a.pre]);
printf("(%d, %d)\n",a.x,a.y);//从第二个节点开始顺序输出,注意中间有个空格
}


int work()//广搜函数
{
int i;
node t1,t2;
memset(vs,0,sizeof(vs));//这个其实无所谓的吧
int sp,head;//sp队尾标志,head队首标志
//初始化左上角
que[0].x=0;
que[0].y=0;
que[0].pre=-1;
vs[0][0]=1;
head=0;
sp=1;
while(head<sp)
{
   t1=que[head];//队首出队
   head++;//对手标记加1
   if(t1.x==4&&t1.y==4)break;//已找到,退出
   t2=t1;
   for(i=0;i<4;i++)//遍历四个方向
   {
    t2.x+=dir[i][0];
    t2.y+=dir[i][1];
    if(judge(t2) && vs[t2.x][t2.y]==0)//vs是已访问
    {
     t2.pre=head-1;//标记前节点(在que里的序号)
     que[sp++]=t2;//进队
     vs[t2.x][t2.y]=1;//标记已访问
    }
   }
}
dfs(t1);
return 0;
}
int main ()
{
int i,j;
for(i=0;i<5;i++)
{
   for(j=0;j<5;j++)scanf("%d",&mm[i][j]);
  
}
printf("(0, 0)\n");
work();
return 0;
}