题意

给定一个 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;
}