Codeforces Round #648 D Solve The Maze

预处理加爆搜

题目链接
题目大意是给一张N*M的地图,地图上有墙、空地、好人和坏人;
**‘.’是空地;
‘#’是墙;
‘G’是好人;
‘B’是坏人;

出口是(N,M)且出口保证是空地,我们要让好人出地图,把所有坏人堵起来
注意是任意一个坏人都不可以到(N,M),否则输出“NO”
还有一点是好人和坏人是无意单位碰撞的
所以样例
2 3
#.G
BG.
这个是“NO”
思路是先把地图扫进去,然后再预处理一下,找到每一个坏人,把它四周变成墙,这里有个提醒的点是如果两个坏人挨在一起,是不能把旁边的坏人变成墙的,因为会影响到后面的坏人的封印。(第一次wa这了)

AC代码

#include
using namespace std;
char a[105][105];
int vis[105][105];
int x,y;
int ans;
int xxx[]={0,0,1,-1};
int yyy[]={1,-1,0,0};
void dfs(int xx,int yy){
	vis[xx][yy]=1;
	if(a[xx][yy]=='G'){
		ans++;
	}
	if(a[xx][yy]=='#'){
		return;
	} 
	for(int i=0;i<4;i++){
		int xxxx=xx+xxx[i];
		int yyyy=yy+yyy[i];
		if(xxxx<0||xxxx>=x||yyyy<0||yyyy>=y){
			continue;
		}
		if(vis[xxxx][yyyy]||vis[xxxx][yyyy]=='#') continue;
		dfs(xxxx,yyyy);
	} 
}
int main(){
	int t;
	cin>>t;
	while(t--){
		memset(vis,0,sizeof(vis));
		cin>>x>>y;
		getchar();
		for(int i=0;i<x;i++){
			for(int j=0;j<y;j++){
				cin>>a[i][j];
			}
			getchar();
		}
		int sum=0;
		ans=0;
		for(int i=0;i<x;i++){
			for(int j=0;j<y;j++){
				if(a[i][j]=='G'){
					sum++;
				}
			}
		}
		for(int i=0;i<x;i++){
			for(int j=0;j<y;j++){
				if(a[i][j]=='B'){
					if(i-1>=0) if(a[i-1][j]!='B') a[i-1][j]='#';
					if(j-1>=0) if(a[i][j-1]!='B') a[i][j-1]='#';
					if(i+1<x) if(a[i+1][j]!='B') a[i+1][j]='#';
					if(j+1<y) if(a[i][j+1]!='B') a[i][j+1]='#';
				}
			}
		}
		dfs(x-1,y-1);
		//cout<
		if(ans!=sum) cout<<"No"<<endl;
		else cout<<"Yes"<<endl; 
	}
}

代码是当场比赛AC的代码,所以变量名没改,看起来很累。
主要是纪录一下自己第一次在CF里做出搜索题。

你可能感兴趣的:(CF)