标签:memory turn eve pes opera http rom class sea
1 3 5 2 2 1 2 3 3 2 1 3 3 3 3 3 3 3 3 3 3 H 2 3 L 2 2 H 3 3 H 1 3 L 2 3
5 2 4 3 1
题意:给出两个n*n的矩阵。一个作为初始矩阵,一个作为目标矩阵。给出m个操作,操作有两种,
一种是“L。x。y”,代表我们要把x这一行赋成y,还有一种是“H,x,y”,代表要把x这一列赋成y,
问我们怎样安排这些操作才干把初始矩阵转化成目标矩阵。
输出方案,special judge
题解:最后一个操作肯定是把某一行或者某一列变成x,我们倒过来模拟,每次把最后一个操作找出来。即每次找到某一行
或者某一列不为0的数都同样的,再找符合操作的。
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<iostream>
#define N 110
using namespace std;
int a[N][N];
struct Cao {
    char s[2];
    int x,v;
    bool used;
} b[N*5];
int ans[N*5];
int n,m;
bool is_H(int i,int k) {
    int x=-1;
    int j=1;
    for(; j<=n; j++) {
        if(a[i][j]) {
            x=a[i][j];
            break;
        }
    }
    if(x==-1)return true;
    if(x!=k)return false;
    for(; j<=n; j++) {
        if(a[i][j]&&a[i][j]!=x)return false;
    }
    return true;
}
bool is_L(int i,int k) {
    int x=-1;
    int j=1;
    for(; j<=n; j++) {
        if(a[j][i]) {
            x=a[j][i];
            break;
        }
    }
    if(x==-1)return true;
    if(x!=k)return false;
    for(; j<=n; j++) {
        if(a[j][i]&&a[j][i]!=x)return false;
    }
    return true;
}
int main() {
    // freopen("test.in","r",stdin);
    int t;
    cin>>t;
    while(t--) {
        scanf("%d%d",&n,&m);
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
                scanf("%d",&a[i][j]);
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
                scanf("%d",&a[i][j]);
        for(int i=1; i<=m; i++) {
            scanf("%s%d%d",b[i].s,&b[i].x,&b[i].v);
            b[i].used=0;
        }
        for(int h=m; h>=1; h--) {
            for(int i=1; i<=m; i++) {
                if(b[i].used)continue;
                if(b[i].s[0]=='H'&&is_H(b[i].x,b[i].v)) {
                    ans[h]=i;
                    b[i].used=1;
                    int p=b[i].x;
                    for(int k=1; k<=n; k++)
                        a[p][k]=0;
                    break;
                } else if(b[i].s[0]=='L'&&is_L(b[i].x,b[i].v)) {
                    ans[h]=i;
                    b[i].used=1;
                    int p=b[i].x;
                    for(int k=1; k<=n; k++)
                        a[k][p]=0;
                    break;
                }
            }
        }
        for(int i=1; i<m; i++)
            printf("%d ",ans[i]);
        printf("%d\n",ans[m]);
    }
    return 0;
}
标签:memory turn eve pes opera http rom class sea
原文地址:http://www.cnblogs.com/mthoutai/p/7040564.html