预处理加爆搜
题目链接
题目大意是给一张N*M的地图,地图上有墙、空地、好人和坏人;
**‘.’是空地;
‘#’是墙;
‘G’是好人;
‘B’是坏人;
出口是(N,M)且出口保证是空地,我们要让好人出地图,把所有坏人堵起来
注意是任意一个坏人都不可以到(N,M),否则输出“NO”
还有一点是好人和坏人是无意单位碰撞的
所以样例
2 3
#.G
BG.
这个是“NO”
思路是先把地图扫进去,然后再预处理一下,找到每一个坏人,把它四周变成墙,这里有个提醒的点是如果两个坏人挨在一起,是不能把旁边的坏人变成墙的,因为会影响到后面的坏人的封印。(第一次wa这了)
AC代码
#include<bits/stdc++.h>
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<<ans<<" "<<sum<<endl;
if(ans!=sum) cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
}
代码是当场比赛AC的代码,所以变量名没改,看起来很累。
主要是纪录一下自己第一次在CF里做出搜索题。