poj3984
顶嵌杯决赛第二题,简单的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;
}