题意
给定一个 H × W H \times W H×W 的矩阵,该矩阵包含 n n n 个联通块,每个联通块都涂上特定的颜色,求是否有相邻的不同联通块颜色相同。
分析
题目数据范围很小,模拟就可以通过。
先计算出每个坐标的颜色,然后再看是否处于同一个联通块,如果不处于同一个联通块但颜色相同就输出 No
并结束程序,否则到最后输出 Yes
。
代码
#include<bits/stdc++.h>
using namespace std;
long long h,w,n,a[505][5005],b[505][505],c[100005];
int main(){
cin>>h>>w>>n;
for(int i=1;i<=h;i++)for(int j=1;j<=w;j++)cin>>a[i][j];
for(int i=1;i<=n;i++)cin>>c[i];
for(int i=1;i<=h;i++)for(int j=1;j<=w;j++)b[i][j]=c[a[i][j]];
for(int i=1;i<=h;i++)
{
for(int j=1;j<=w;j++)
{
if((b[i][j]==b[i][j+1]&&a[i][j]!=a[i][j+1])||b[i][j]==b[i][j-1]&&a[i][j]!=a[i][j-1]||b[i][j]==b[i-1][j]&&a[i][j]!=a[i-1][j]||b[i][j]==b[i+1][j]&&a[i+1][j]!=a[i][j])
{
cout<<"No";
return 0;
}
}
}
cout<<"Yes";
return 0;
}