标签:多校联合
【题目链接】:click here~~
【题意】:
操作L x y,把当前x,这一列全部置为y
操作H x y,把当前,这一行全部置为y。
现在给你n?n的初始矩阵,以及n?n的目标矩阵
现在给你m种操作(由以上两种操作构成),问怎么排序这m种操作,才能使得,初始矩阵,经由排序后的操作,构成目标矩阵。
输出排序方案。
也就是给出初始矩阵和目标矩阵,存在m中操作,可以分别把每行或者每列都涂成同一种颜色,数据保证有解,因为保证有解,(然而初始矩阵并没有什么卵用。。。)
【思路】:
暴力寻找M次操作,若目标矩阵的行或列全和该操作的颜色一样,则最后进行此操作,并把所有涂的点涂为颜色0(可当任意颜色)
然后同样依次推出之前的操作,因为之后的操作会覆盖掉之前操作的点。
PS:比赛当时居然又忽略了,
代码:
#include<bits/stdc++.h> using namespace std; const int N=505; int goal[N][N]; int n,m; inline int read(){ int c=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){c=c*10+ch-'0';ch=getchar();} return c*f; } struct node{ char op; int x,y; } mat[N]; char s[2]; int ans[N]; int main(){ int i,j,t; t=read(); while(t--){ memset(goal,0,sizeof(goal)); memset(ans,0,sizeof(ans)); int cnt,num; n=read();m=read(); for( i=1; i<=n; ++i) for(j=1; j<=n; ++j)goal[i][j]=read(); for(i=1; i<=n; ++i) for(j=1; j<=n; ++j)goal[i][j]=read(); for(i=1; i<=m; ++i){ scanf("%s %d %d",s,&mat[i].x,&mat[i].y); mat[i].op=s[0]; } cnt=m; int c1,c2,fH=0,fL=0; while(cnt!=0){ for(i=1; i<=m; ++i){ if(mat[i].x!=0){ c1=mat[i].x; c2=mat[i].y; if(mat[i].op=='H'){ for(j=1; j<=n; j++) if(goal[c1][j]!=0&&goal[c1][j]!=c2) break; if(j==n+1){ for(int k=1; k<=n; k++) goal[c1][k]=0; ans[cnt--]=i; mat[i].x=0; } } else{ for(j=1; j<=n; j++) if(goal[j][c1]!=0&&goal[j][c1]!=c2) break; if(j==n+1){ for(int k=1; k<=n; k++) goal[k][c1]=0; ans[cnt--]=i; mat[i].x=0; } } } } } for(i=1; i<=m; i++) printf("%d ",ans[i]); puts(""); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:多校联合
原文地址:http://blog.csdn.net/u013050857/article/details/47663229