zstu 2428 How to be An ACMan

这道题我记得是今年暑假集训的时候做过的,当时搞了好久都搞不出来,其实这道题用DFS思路更简单,但是我就是比较喜欢用BFS,但是BFS要做好路径的回溯,否则很容易漏掉最短时长,作为ZSTU的amcer,大家要加油额。

其实做搜索题时,往往DFS和BFS都是可以的,区别在时间和空间的复杂度不同,所以碰到搜索题,最好两种方法都写一遍,这样对下次碰到类似题就知道BFS和DFS对于该题的优劣了。

这是AC代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
int n,m,xx,yy,xi,yi;
const int INF=10000000;
char map[55][55];
int vis[55][55],sum[55][55];
int dir[4][2]={1,0,-1,0,0,1,0,-1};
struct node 
{
	int x,y;
};
void bfs()
{
	queue<node> qq;
	node p;
	p.x=xx;
	p.y=yy;
	qq.push(p);
	sum[xx][yy]=0;
	vis[xx][yy]=1;
	while(!qq.empty())
	{
		node q;
		q=qq.front();
		qq.pop();
		vis[q.x][q.y]=0;
		for(int i=0;i<4;i++)
		{
			int x=q.x+dir[i][0];
			int y=q.y+dir[i][1];
			if(map[x][y]=='#'||x<0||y<0||x>=n||y>=m)
				continue;
			int add;
			if(map[x][y]=='x')
			{
				add=2;
			}
			else if(map[x][y]=='X')
			{
				add=3;
			}
			else
			{
				add=1;
			}
			if(sum[q.x][q.y]+add<sum[x][y]){
				sum[x][y]=sum[q.x][q.y]+add;
			    if(!vis[x][y])
			    {
				    node w;
				    w.x=x;
				    w.y=y;
				    qq.push(w);
				    vis[x][y]=1;
			    }
			}
		}
	}
	if(sum[xi][yi]==INF)
		printf("-1\n");
	else
		printf("%d\n",sum[xi][yi]);
}
int main(void)
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d",&n,&m);
		for(int i=0;i<n;i++)
			scanf("%s",map[i]);
		for(int i=0;i<n;i++)
			for(int j=0;j<m;j++)
				if(map[i][j]=='p')
				{
					xx=i;
					yy=j;
				}
				else if(map[i][j]=='g')
				{
					xi=i;
					yi=j;
				}
		for(int i=0;i<n;i++)
			for(int j=0;j<m;j++)
				sum[i][j]=INF;
		memset(vis,0,sizeof(vis));
		bfs();
	}
}


 

你可能感兴趣的:(zstu 2428 How to be An ACMan)