Hamiltonian Wall - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
![](https://i-blog.csdnimg.cn/blog_migrate/5a84bb23c088ac97971155404f2ec088.png)
![](https://i-blog.csdnimg.cn/blog_migrate/87d74dc12a72a9ec9a237ec26c4bfacc.png)
判断是否通过一笔滑 的方式走完 全部B
#include <bits/stdc++.h>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <set>
#include <queue>
#define x first
#define int long long
#define y second
#define ios ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
typedef pair<char,int> PCI;
typedef pair<string,int> PSI;
typedef pair<LL,LL> PLL;
//typedef __int128 i128;
typedef unsigned long long ULL;
const int N=2e5+10,INF = 1e9 ,mod = 1e9 + 7 ,P = 131;
const double eps = 1e-7;
int n,m;
void solve()
{
cin >> n;
string s[2];
cin >> s[0] >> s[1];
int cnt= count(s[0].begin(),s[0].end(),'B') + count(s[1].begin(),s[1].end(),'B');
vector dp(2,vector<int>(n,0));// c++ 20
vector<vector<int>> dp(2,vector<int>(n,0));//c++ 11 dp[2][n]={0}
for(int j=0;j<n ;j++ )
{
for(int i=0;i<2;i ++ )// 判断每一列中的两行
{
if(s[i][j] == 'W') continue;
if(!j) dp[i][j] = 1;
else if(s[i][j-1] == 'B') dp[i][j] = dp[i][j-1] + 1;
// 可以从右边转移过来
}
if(s[0][j] == 'B' && s[1][j] == 'B') // 一列中两行都是B,可以上下走
{
int t= dp[0][j];
dp[0][j] = max(dp[0][j],dp[1][j] + 1);
dp[1][j] = max(dp[1][j],t + 1);
}
// 任何一个 地方 走过的B个数 等于 总的个数 就算是找到了
if(dp[0][j] == cnt || dp[1][j] == cnt)
{
cout << "YES\n";
return;
}
}
cout <<"NO\n";
}
signed main()
{
// freopen("1.txt","r",stdin);
ios
LL T=1;
cin>>T;
while(T -- )
{
solve();
}
return 0;
}