标签:c++
7 8 #.#####. #.a#..r. #..#x... ..#..#.# #...##.. .#...... ........
13 题意:一个牢房图,#是墙壁,a是angel,r是angel的朋友,x是敌人,每走一步消耗1个单位时间,消灭1个敌人也消耗一个单位时间,求r到a的最小时间。。 按照正常的思路:直接从R BFS 到 a 遇到 x就多加一个时间 就行了 不过这样是不对了(题目太水 还是A了) 伪AC代码:#include<iostream> #include<cstdio> #include<queue> using namespace std; #define w 205 char map[w][w]; int vis[w][w]; int sx,sy; int m,n; struct node { int x,y,time; }; int fx[4][2]={1,0,0,1,-1,0,0,-1}; int bfs() { int tx,ty; memset(vis,0,sizeof(vis)); node now,next; queue<node>q; now.x=sx;now.y=sy;now.time=0; vis[sx][sy]=1; q.push(now); while(!q.empty()) { now=q.front(); q.pop(); if(map[now.x][now.y]=='r') return now.time; for(int i=0;i<4;i++) { tx=now.x+fx[i][0]; ty=now.y+fx[i][1]; if(tx<1||tx>m||ty<1||ty>n||vis[tx][ty]==1||map[tx][ty]=='#') continue; vis[tx][ty]=1; next.x=tx; next.y=ty; if(map[tx][ty]=='x') next.time=now.time+2; else next.time=now.time+1; q.push(next); } } return -1; } int main() { int i,j; while(cin>>m>>n) { for(i=1;i<=m;i++) for(j=1;j<=n;j++) { cin>>map[i][j]; if(map[i][j]=='a') { sx=i;sy=j; } } int ss= bfs(); if(ss==-1) printf("Poor ANGEL has to stay in the prison all his life.\n"); else printf("%d\n",ss); } return 0; }
但面对这组数据:
3 4a... ##x. ###r结果 却是6(应该是5啊)
原因其实是(2,3) 和(1.4)是同步进入队列的 进入的顺序和方向数组有关= =
这个问题可以用优先队列解决, 详见代码
优先队列版:#include<iostream> #include<cstdio> #include<queue> using namespace std; #define w 205 char map[w][w]; int vis[w][w]; int sx,sy; int m,n; struct node { int x,y,time; bool operator <(const node & t) const { return time>t.time; //改成<号 则较大的先出队 } }; int fx[4][2]={1,0,0,1,-1,0,0,-1}; int bfs() { int tx,ty; memset(vis,0,sizeof(vis)); node now,next; priority_queue<node>q; //加上前缀 priority_ now.x=sx;now.y=sy;now.time=0; vis[sx][sy]=1; q.push(now); while(!q.empty()) { now=q.top(); //优先队列不能用 q.front(); q.pop(); if(map[now.x][now.y]=='r') return now.time; for(int i=0;i<4;i++) { tx=now.x+fx[i][0]; ty=now.y+fx[i][1]; if(tx<1||tx>m||ty<1||ty>n||vis[tx][ty]==1||map[tx][ty]=='#') continue; vis[tx][ty]=1; next.x=tx; next.y=ty; if(map[tx][ty]=='x') next.time=now.time+2; else next.time=now.time+1; q.push(next); } } return -1; } int main() { int i,j; while(cin>>m>>n) { for(i=1;i<=m;i++) for(j=1;j<=n;j++) { cin>>map[i][j]; if(map[i][j]=='a') { sx=i;sy=j; } } int ss= bfs(); if(ss==-1) printf("Poor ANGEL has to stay in the prison all his life.\n"); else printf("%d\n",ss); } return 0; }
模板。。。
标签:c++
原文地址:http://blog.csdn.net/axuan_k/article/details/38065319