[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
"); break;}
            if(na==0&&i==m) {printf("NO
"); break;}
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/shandongs1/p/8405425.html