标签: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