题意:给你一个n*n的初始矩阵 再给你一个n*n的目标矩阵,然后有两种操作:L X Y表示将第X列全部替换成Y,H X Y表示将第X行全部替换为Y,给你m次操作让你安排顺序使得初始矩阵转换成目标矩阵,输出任意一种可行顺序
思路: 题目保证一定有解,又因为操作是整行或整列替换且初始矩阵没有用(会覆盖),所以可以假设为零矩阵,然后从目标矩阵开始通过给的操作使整行或整列变为零,直到目标矩阵变为零矩阵,然后逆序输出操作序号,过程纯暴力
代码:
#include <algorithm> #include <iostream> #include <sstream> #include <cstdlib> #include <cstring> #include <iomanip> #include <cstdio> #include <string> #include <bitset> #include <vector> #include <queue> #include <stack> #include <cmath> #include <list> #include <map> #include <set> #define sss(a,b,c) scanf("%d%d%d",&a,&b,&c) #define mem1(a) memset(a,-1,sizeof(a)) #define mem(a) memset(a,0,sizeof(a)) #define ss(a,b) scanf("%d%d",&a,&b) #define s(a) scanf("%d",&a) #define p(a) printf("%d\n", a) #define INF 0x3f3f3f3f #define w(a) while(a) #define PI acos(-1.0) #define LL long long #define eps 10E-9 #define N 3000010 #define mod 3221225473 const int SIGMA_SIZE=26; const int MAXN=100010; const int MAXNODE=600010; using namespace std; void mys(int& res) { int flag=0; char ch; while(!(((ch=getchar())>='0'&&ch<='9')||ch=='-')) if(ch==EOF) res=INF; if(ch=='-') flag=1; else if(ch>='0'&&ch<='9') res=ch-'0'; while((ch=getchar())>='0'&&ch<='9') res=res*10+ch-'0'; res=flag?-res:res; } void myp(int a) { if(a>9) myp(a/10); putchar(a%10+'0'); } /*************************THE END OF TEMPLATE************************/ int arr[105][505]; int ans[505]; struct node { char c[2]; int x, y; }op[505]; int main() { int n, t, m; s(t); w(t--){ ss(n, m); for(int i=1; i<=n; i++){ for(int j=1; j<=n; j++) s(arr[i][j]); } for(int i=1; i<=n; i++){ for(int j=1; j<=n; j++) s(arr[i][j]); } for(int i=1; i<=m; i++){ scanf("%s%d%d",op[i].c,&op[i].x,&op[i].y); } int cnt=0, j; w(cnt<m){ for(int i=1; i<=m; i++){ if(!op[i].x) continue; int x = op[i].x; if(op[i].c[0] == 'L'){ for(j=1; j<=n; j++){ if(arr[j][x] && arr[j][x] != op[i].y) break; } if(j>n){ ans[++cnt] = i, op[i].x =0; for(int j=1; j<=n; j++) arr[j][x] = 0; } } else{ for( j=1; j<=n; j++){ if(arr[x][j] && arr[x][j] != op[i].y) break; } if(j>n){ ans[++cnt] = i, op[i].x =0; for(int j=1; j<=n; j++) arr[x][j] = 0; } } } } for(int i=m; i>=1; i--) printf("%d%c",ans[i],m==1?'\n':' '); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-23 13:57:56