标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1027 Accepted Submission(s): 351
Special Judge
题目大意:给你一个n*n的矩阵,给你初始矩阵和目标矩阵,然后有m个操作。H x z表示将第x行覆盖为z,L x z表示将第x列覆盖为z,保证是有解。问你这m个操作怎么排,可以让初始矩阵变为目标矩阵。
解题思路:遍历m个操作,如果是行操作,就看该行是否都是所要染的颜色或着是0颜色,如果这一行跟要染的颜色一样,那么就存起来操作,同时把该行全部变为0,。由于不是一次下来就能得到结果,所以用一个变量记录已经有多少个操作已经在结果中,最后逆序输出即为答案。
#include<bits/stdc++.h> using namespace std; struct Oper{ int r_,x,col; }opers[550]; int Map[125][125],ans[550],vis[550]; int main(){ int t,a,n,m; 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); } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ scanf("%d",&Map[i][j]); } } int a,b; char str[20]; for(int i=1;i<=m;i++){ scanf("%s%d%d",str,&a,&b); if(str[0]==‘H‘){ opers[i].r_=1; opers[i].x=a; opers[i].col=b; }else{ opers[i].r_=0; opers[i].x=a; opers[i].col=b; } } memset(vis,0,sizeof(vis)); int cnt=0; while(cnt<m){ for(int i=1;i<=m;i++){ if(!vis[i]){ if(opers[i].r_==1){ int r=opers[i].x,aim=opers[i].col; int j; for(j=1;j<=n;j++){ if(Map[r][j]!=aim&&Map[r][j]!=0){ break; } } if(j==n+1){ for(j = 1;j<=n;j++){ Map[r][j]=0; } ans[cnt]=i; cnt++; vis[i]=1; } }else{ int c=opers[i].x,aim=opers[i].col; int j; for(j=1;j<=n;j++){ if(Map[j][c]!=aim&&Map[j][c]!=0){ break; } } if(j==n+1){ for(j = 1;j<=n;j++){ Map[j][c]=0; } ans[cnt]=i; cnt++; vis[i]=1; } } } } } printf("%d",ans[cnt-1]); for(int i=cnt-2;i>=0;i--){ printf(" %d",ans[i]); }printf("\n"); } return 0; }
标签:
原文地址:http://www.cnblogs.com/chengsheng/p/4732247.html