链接:https://codeforces.ml/contest/1365/problem/D
Vivek has encountered a problem. He has a maze that can be represented as an n×mn×m grid. Each of the grid cells may represent the following:
- Empty — '.'
- Wall — '#'
- Good person — 'G'
- Bad person — 'B'
The only escape from the maze is at cell (n,m)(n,m).
A person can move to a cell only if it shares a side with their current cell and does not contain a wall. Vivek wants to block some of the empty cells by replacing them with walls in such a way, that all the good people are able to escape, while none of the bad people are able to. A cell that initially contains 'G' or 'B' cannot be blocked and can be travelled through.
Help him determine if there exists a way to replace some (zero or more) empty cells with walls to satisfy the above conditions.
It is guaranteed that the cell (n,m)(n,m) is empty. Vivek can also block this cell.
Input
The first line contains one integer tt (1≤t≤100)(1≤t≤100) — the number of test cases. The description of the test cases follows.
The first line of each test case contains two integers nn, mm (1≤n,m≤50)(1≤n,m≤50) — the number of rows and columns in the maze.
Each of the next nn lines contain mm characters. They describe the layout of the maze. If a character on a line equals '.', the corresponding cell is empty. If it equals '#', the cell has a wall. 'G' corresponds to a good person and 'B' corresponds to a bad person.
Output
For each test case, print "Yes" if there exists a way to replace some empty cells with walls to satisfy the given conditions. Otherwise print "No"
You may print every letter in any case (upper or lower).
Example
input
Copy
6 1 1 . 1 2 G. 2 2 #B G. 2 3 G.# B#. 3 3 #B. #.. GG. 2 2 #B B.
output
Copy
Yes Yes No No Yes Yes
Note
For the first and second test cases, all conditions are already satisfied.
For the third test case, there is only one empty cell (2,2)(2,2), and if it is replaced with a wall then the good person at (1,2)(1,2) will not be able to escape.
For the fourth test case, the good person at (1,1)(1,1) cannot escape.
For the fifth test case, Vivek can block the cells (2,3)(2,3) and (2,2)(2,2).
For the last test case, Vivek can block the destination cell (2,2)(2,2).
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll T,n,m,flag;
ll a[100][100],k,s;
char x[100][100];
void dfs(int i,int j)
{
if(a[i+1][j]==0&&(x[i+1][j]=='.'||x[i+1][j]=='G')&&i+1<n)
{
a[i+1][j]=1;
dfs(i+1,j);
}
if(a[i-1][j]==0&&(x[i-1][j]=='.'||x[i-1][j]=='G')&&i-1>=0)
{
a[i-1][j]=1;
dfs(i-1,j);
}
if(a[i][j+1]==0&&(x[i][j+1]=='.'||x[i][j+1]=='G')&&j+1<m)
{
a[i][j+1]=1;
dfs(i,j+1);
}
if(a[i][j-1]==0&&(x[i][j-1]=='.'||x[i][j-1]=='G')&&j-1>=0)
{
a[i][j-1]=1;
dfs(i,j-1);
}
}
int main()
{
cin>>T;
while(T--)
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
cin>>x[i];
}
flag=1;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(x[i][j]=='B')
{
if(i<n-1)
{
if(x[i+1][j]=='.')
{
x[i+1][j]='#';
}
else if(x[i+1][j]=='G')
{
flag=0;
break;
}
}
if(j<m-1)
{
if(x[i][j+1]=='.')
{
x[i][j+1]='#';
}
else if(x[i][j+1]=='G')
{
flag=0;
break;
}
}
if(j>0)
{
if(x[i][j-1]=='.')
{
x[i][j-1]='#';
}
else if(x[i][j-1]=='G')
{
flag=0;
break;
}
}
if(i>0)
{
if(x[i-1][j]=='.')
{
x[i-1][j]='#';
}
else if(x[i-1][j]=='G')
{
flag=0;
break;
}
}
}
if(flag==0)
break;
}
}
if(x[n-1][m-1]=='B')
flag=0;
memset(a,0,sizeof(a));
a[n-1][m-1]=1;
dfs(n-1,m-1);
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(x[i][j]=='G')
{
if(x[n-1][m-1]=='#')
{
flag=0;
break;
}
if(a[i][j]==0)
{
flag=0;
break;
}
}
}
if(flag==0)
break;
}
if(flag)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
}

这篇博客探讨了如何解决一个迷宫问题,其中Vivek需要阻止坏人逃出而确保好人能够逃脱。迷宫由不同类型的单元格组成,包括空地、墙、好人和坏人。Vivek可以将空地改造成墙来阻止路径。博客介绍了如何确定是否存在一种方法,在不阻碍好人的情况下阻止所有坏人的逃脱。文章包含多个示例和解决方案,并提供了输入输出示例以帮助理解问题。
1316

被折叠的 条评论
为什么被折叠?



