最近想做做搜索,bfs、dfs、图一直都不敢去碰。。找了题比较直接的题目来做、、、、
只是要注意friend只有一个。。。。其他没什么易错了好像
#include<stdio.h>
#include<string.h>
#define MAX 205
struct line
{
int x,y,t;
}query[MAX*MAX],direct[4];
int map[MAX][MAX],ans;
int get(char x)
{
switch(x)
{
case '.':return 0;
case 'a':return -2;
case 'r':return -1;
case '#':return -3;
default:return -4;
}
}
void set(int i,int j,int num)
{
query[ans].x=i;
query[ans].y=j;
query[ans++].t=num;
}
void print(int n,int m)
{
int i,j;
printf("@@@@@@@@\n");
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
printf("%d ",map[i][j]);
printf("\n");
}
printf("@@@@@@@\n");
}
void print1()
{
int i;
printf("########\n");
for(i=0;i<ans;i++)
printf("%d %d %d\n",query[i].x,query[i].y,query[i].t);
printf("########\n");
}
void initdirect()
{
direct[0].x=0,direct[0].y=1,direct[0].t=0;
direct[1].x=1,direct[1].y=0,direct[1].t=0;
direct[2].x=0,direct[2].y=-1,direct[2].t=0;
direct[3].x=-1,direct[3].y=0,direct[3].t=0;
}
int bfs(int n,int m)
{
int i,j;
struct line a;
initdirect();
for(i=0;i<ans;i++)
{
for(j=0;j<4;j++)
{
a.x=query[i].x+direct[j].x;
a.y=query[i].y+direct[j].y;
a.t=query[i].t;
if(a.x>=0&&a.x<n&&a.y>=0&&a.y<m)
{
// printf("%d %d %d\n",a.x,a.y,a.t);
if(map[a.x][a.y]==-2)return a.t+1;
if(map[a.x][a.y]==-4)
{
set(a.x,a.y,a.t+2);
map[a.x][a.y]=1;
}
if(!map[a.x][a.y])
{
set(a.x,a.y,a.t+1);
map[a.x][a.y]=1;
}
}
}
}
return -1;
}
int main()
{
int n,m,i,j,flag;
char a;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0;i<n;i++)
{
getchar();
for(j=0;j<m;j++)
{
scanf("%c",&a);
map[i][j]=get(a);
if(map[i][j]==-1)
{
ans=0;
set(i,j,0);
}
}
}
// print(n,m);
// print1();
flag=bfs(n,m);
if(flag==-1)printf("Poor ANGEL has to stay in the prison all his life.\n");
else
printf("%d\n",flag);
}
return 0;
}