很明显是个搜索题。开始就写。好久没写搜索的缘故,对自己的代码不自信呀,然后,写好就TLE啦。后来想想才知道,对于最少步数,最好用BFS,搜到就能结束。
改成BFS后,悲剧并没有结束,交了几次WA。测试了几组数据找不出错误,后来没忍住去看解题报告了,才发现应该用优先队列存储状态,步数小的优先搜索。改了一下就AC啦啦啦啦 加油!!吖飒~~~~
题意:
给出地图,求最少步数。其中a是目标,r是起点,x是时间多加1的点。
分析,
对于每个状态,搜索后再修改状态。优先队列需要重载<,使c小的在前。
代码:
把DFS一起附上,当模板看
#include<iostream>
#include<queue>
using namespace std;
char map[205][205];
int endx,endy;
int Min;int n,m;
struct info
{
int x,y,c;
};
//深搜
bool DFS(int bx,int by,int cnt)
{
char c;
if(bx==endx&&by==endy)
{
if(cnt<Min) Min=cnt;
return true;
}
if(map[bx-1][by]!='#') //上
{
if(map[bx-1][by]=='x') cnt++;
c=map[bx-1][by];
map[bx-1][by]='#';
DFS(bx-1,by,cnt+1);
map[bx-1][by]=c;
}
if(map[bx+1][by]!='#') //下
{
if(map[bx+1][by]=='x') cnt++;
c=map[bx+1][by];
map[bx+1][by]='#';
DFS(bx+1,by,cnt+1);
map[bx+1][by]=c;
}
if(map[bx][by+1]!='#') //右
{
if(map[bx][by+1]=='x') cnt++;
c=map[bx][by+1];
map[bx][by+1]='#';
DFS(bx,by+1,cnt+1);
map[bx][by+1]=c;
}
if(map[bx][by-1]!='#') //左
{
if(map[bx][by-1]=='x') cnt++;
c=map[bx][by-1];
map[bx][by-1]='#';
DFS(bx,by-1,cnt+1);
map[bx][by-1]=c;
}
if(Min==n*m) return false;
}
//广搜
bool operator<(info a, info b) {return a.c > b.c;}
void BFS(info X)
{
char cc;
priority_queue<info> Q;
Q.push(X);
while(!Q.empty())
{
X=Q.top();
Q.pop();
map[X.x][X.y]='#';//已搜过
if(X.x==endx&&X.y==endy) {Min=X.c;break;}
info A,B,C,D;
if(map[X.x-1][X.y]!='#') //上
{
A.c=X.c+1;A.x=X.x-1;A.y=X.y;
if(map[X.x-1][X.y]=='x') A.c++;
Q.push(A);
}
if(map[X.x+1][X.y]!='#') //下
{
B.c=X.c+1;B.x=X.x+1;B.y=X.y;
if(map[X.x+1][X.y]=='x') B.c++;
Q.push(B);
}
if(map[X.x][X.y+1]!='#') //右
{
C.c=X.c+1;C.x=X.x;C.y=X.y+1;
if(map[X.x][X.y+1]=='x') C.c++;
Q.push(C);
}
if(map[X.x][X.y-1]!='#') //左
{
D.c=X.c+1;D.x=X.x;D.y=X.y-1;
if(map[X.x][X.y-1]=='x') D.c++;
Q.push(D);
}
}
while(!Q.empty())
{
Q.pop();
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
getchar();
Min=0;
int i,j;
for(i=0;i<=n+1;i++)
{
map[i][0]='#';//第一列
map[i][m+1]='#';//最后一列
}
for(i=0;i<=m+1;i++)//行
{
map[0][i]='#';//第一行
map[n+1][i]='#';//最后一行
}
int bx,by;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%c",&map[i][j]);
if(map[i][j]=='a') {endx=i;endy=j;}
else if(map[i][j]=='r') {bx=i;by=j;map[i][j]='#';}
}
getchar();
}
// if(!DFS(bx,by,0))
// printf("Poor ANGEL has to stay in the prison all his life.\n");
// else printf("%d\n",Min);
info B;
B.c=0;B.x=bx;B.y=by;
//最少步数用广搜,一搜到就是最少步数。
BFS(B);
if(!Min) printf("Poor ANGEL has to stay in the prison all his life.\n");
else printf("%d\n",Min);
}
return 0;
}