标签:des c style class blog code
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1242
题目:
7 8 #.#####. #.a#..r. #..#x... ..#..#.# #...##.. .#...... ........
13
Angel‘s friends
结果单组就可以过了。。。还有就是这个题目因为碰到守卫会出现时间的不同变化。。所以我运用了剪枝。。。如果步数大于已经确定的步数,则不需要入队。。这个还是挺高效的。。0ms。。。。代码如下:
#include<cstdio>
#include<queue>
#include<cstring>
#define INF 0x3f3f3f3f
const int maxn=200+10;
using namespace std;
int dx[4]={0,0,-1,1};
int dy[4]={-1,1,0,0};
int step[maxn][maxn];
int n,m;
int sum;
char map[maxn][maxn];
struct Map
{
int x,y;
int time;
};
queue<Map>q;
Map start,end;
int check(int x,int y)
{
if(x>=1&&x<=n&&y>=1&&y<=m)
return 1;
return 0;
}
int bfs()
{
Map current,next;
step[start.x][start.y]=0;
q.push(start);
while(!q.empty())
{
current=q.front();
q.pop();
for(int i=0;i<4;i++)
{
next.x=current.x+dx[i];
next.y=current.y+dy[i];
next.time=current.time+1;
if(map[next.x][next.y]=='x')
next.time++;
if(check(next.x,next.y)&&map[next.x][next.y]!='#'&&next.time<step[next.x][next.y])
{
step[next.x][next.y]=next.time;
q.push(next);
}
}
}
return step[end.x][end.y];
}
int main()
{
int sx,sy;
char str[maxn];
int pos=0,ans=INF;
int i,j;
while(scanf("%d%d",&n,&m)!=EOF)
{
//memset(vis,false,sizeof(vis));
memset(step,INF,sizeof(step));
for(int i=1;i<=n;i++)
{
scanf("%s",str);
for(int j=1;j<=m;j++)
{
map[i][j]=str[j-1];
if(map[i][j]=='r') start.x=i,start.y=j,start.time=0;
if(map[i][j]=='a') end.x=i,end.y=j;
}
}
ans=bfs();
if(ans!=INF)
printf("%d\n",ans);
else
printf("Poor ANGEL has to stay in the prison all his life.\n");
}
return 0;
}
/*
2 2
r.
.a
4 4
a...
#.xx
.#r.
..##
*/
标签:des c style class blog code
原文地址:http://blog.csdn.net/u014303647/article/details/27354437