[Luogu] 魔板
https://www.luogu.org/problemnew/show/P1275
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; int n,m,k; int mb[101][101],now[101][101]; bool lm[101],yp[101]; int search(int fir) { int i,j,t,bj=0; for(i=1; i<=n; i++) { //如果和第一行不一样,则改变 if(now[i][fir]!=mb[i][1])lm[i]=1;//lm:记录横行是否发生改变 else lm[i]=0; } yp[fir]=1;//第一行已经和fir配对 for(i=2; i<=m; i++) { //枚举目标状态 bj=0; for(j=1; j<=m; j++) { //枚举当前状态 if(yp[j]==0)//如果当前行没有被占用 for(t=1; t<=n; t++) { if((lm[t]==1&&now[t][j]!=mb[t][i])||(lm[t]==0&&now[t][j]==mb[t][i])) { if(t==n) { bj=1; yp[j]=1; } } else break; } if(bj==1)break; if(j==m)return 0; } } return 1; } int main() { int i,j,t,na; scanf("%d",&k); for(t=1; t<=k; t++) { scanf("%d%d",&n,&m); for(i=1; i<=n; i++) for(j=1; j<=m; j++)scanf("%d",&now[i][j]); for(i=1; i<=n; i++) for(j=1; j<=m; j++)scanf("%d",&mb[i][j]); for(i=1; i<=m; i++) { memset(yp,0,sizeof(yp)); na=search(i); if(na==1) {printf("YES\n"); break;} if(na==0&&i==m) {printf("NO\n"); break;} } } return 0; }