Sample Input
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
Sample Output
5 2 4 3 1
给你一个初始矩阵和目标矩阵,包含‘L’ , ' H' 两个操作, ‘L x y’ 表示把第x列全赋值成y, ‘Hx y’ 表示把第x行全赋值成y。
求怎样的顺序可以得出目标矩阵。
倒着求解,在目标矩阵上你肯定能找到最后一个操作,这样倒推出答案即可
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #include<vector> #include<map> #include<set> #include<queue> #include<stack> #include<string> #include<algorithm> using namespace std; #define maxn 200050 int T,n,m,t,k,l,tot,j; int a[105][105]; int b[505],c[505],ans[505]; char p[505],ch; int main() { scanf("%d",&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]); t = 0; tot = 0; for(int i = 1; i <= m; i++) { for(ch=getchar(); ch!='H'&&ch!='L'; ch=getchar()); p[i] = ch; scanf("%d%d",&b[i],&c[i]); } while(tot < m) { for(int i=1;i<=m;++i) if(b[i]) { int t = b[i]; if(p[i] == 'L') { for(j = 1; j <= n; j++) if(a[j][t] && a[j][t] != c[i]) break; if(j > n) { for(int j = 1; j <= n; j++) a[j][t] = 0; b[i] = 0; ans[tot++] = i; } } else { for(j = 1; j <= n; j++) if(a[t][j] && a[t][j] != c[i]) break; if(j > n) { for(int j = 1; j <= n; j++) a[t][j] = 0; b[i] = 0; ans[tot++] = i; } } } } for(int i=m-1; i>=0; --i)printf("%d ",ans[i]); printf(" "); } return 0; }