0
点赞
收藏
分享

微信扫一扫

中石油 问题 C: 棋盘行走 (dfs+剪枝)


链接

题意:

就是让你找到一个同颜色的回路,至少长度为4。

分析:

首先我们看他是个需要一个回路,所以我们要爆搜一个颜色,然后记录下当前点走过,如果再长度大于4的基础上回来那么就满足条件,然后我们考虑剪枝的问题,如果我们用一种颜色搜到另一个地方,并且通过这个点搜到的点并不能构成回路,那么我们就不需要再去搜这个个路径上的所有点了,因为他们是联通的。然后这里我们就需要考虑这个长度为4的条件,或种说法就是不能他从那来直接回那去,这样是不合法的,所以我们开个数组维护他前一个点去的方向,这样就能保证不沿着他去的反方向回来即可。
注意我用的方向:上 是对应的4-下+1,这样就简单多了,也可以直接用数组存放。只要实现不是两个点构成的回路即可。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef unsigned long long ull;

#define x first
#define y second
#define sf scanf
#define pf printf
#define PI acos(-1)
#define inf 0x3f3f3f3f
#define lowbit(x) ((-x)&x)
#define mem(a,x) memset(a,x,sizeof(a))
#define rep(i,n) for(int i=0;i<(n);++i)
#define repi(i,a,b) for(int i=int(a);i<=(b);++i)
#define repr(i,b,a) for(int i=int(b);i>=(a);--i)
#define debug(x) cout << #x << ": " << x << endl;

const int MOD = 998244353;
const int mod = 998244353;
const int maxn = 2e5 + 10;
const int dx[] = {0, 1, 0, 0, -1};
const int dy[] = {0, 0, -1, 1, 0};
const int dz[] = {1, -1, 0, 0, 0, 0 };
int day[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
char ch[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

inline void read(__int128 &X)
{
X = 0;
int w=0; char ch=0;
while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
if (w) X = -X;
}
void print(__int128 x)
{
if (!x) return ;
if (x < 0) putchar('-'),x = -x;
print(x / 10);
putchar(x % 10 + '0');
}

ll n,m;
string str[500];
ll dp[55][55],vis[55][55];
ll flag;
void dfs(ll x,ll y,ll num){
if(flag==1) return ;
if(dp[x][y]==1) {
flag=1;
return ;
}

dp[x][y]=1;
for(int i=1;i<=4;i++){
ll fx=dx[i]+x;
ll fy=dy[i]+y;
if(fx>=0&&fx<n&&fy>=0&&fy<m){
if(str[fx][fy]==str[x][y]&&vis[fx][fy]!=4-i+1){
vis[x][y]=i;
dfs(fx,fy,i);
}
}
}
}
void solve(){
scanf("%lld%lld",&n,&m);
for(int i=0;i<n;i++){
cin>>str[i];
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(dp[i][j]==0){
dfs(i,j,0);
if(flag){
puts("Yes");
return ;
}
}

}
}
puts("No");
}

int main(){
ll t=1;
///scanf("%lld",&t);
while(t--) solve();
return 0;
}

举报

相关推荐

0 条评论