标签:
http://acm.hdu.edu.cn/showproblem.php?pid=5386
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
/** hdu5386 模拟 题目大意:给一个棋盘涂色,每次操作给棋盘的某一列或一行涂上一种颜色,给定初始棋盘状态和最终棋盘状态,和一系列操作,请给这些序列排一个顺序 解题思路:初始棋盘其实并没有什么用,我们从最终棋盘入手,每次找到一行或一列颜色全部一样的,如给定操作中有给这一行的如此操作,那么给此操作入队, 依次下去得到一个顺序,输出即可 */ #include <stdio.h> #include <string.h> #include <algorithm> #include <iostream> #include <vector> using namespace std; const int maxn=105; vector<pair<int,int> > x_vec[maxn],y_vec[maxn]; int a[maxn][maxn],n,m; int flag[maxn],num[maxn*5],judge[maxn*5]; int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); int mm=m; int x; for(int i=0;i<n*n;i++)scanf("%d",&x); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { scanf("%d",&a[i][j]); } } for(int i=0;i<=n;i++) { x_vec[i].clear(); y_vec[i].clear(); } for(int i=1;i<=m;i++) { char s[10]; int x,y; scanf("%s%d%d",s,&x,&y); if(s[0]=='H') { x_vec[x].push_back(make_pair(y,i)); } else { y_vec[x].push_back(make_pair(y,i)); } } memset(judge,0,sizeof(judge)); while(m) { // printf("**************%d\n",m); int sum=0,ok=0; for(int i=1;i<=n&&sum==0;i++) { for(int j=1;j<=n&&sum==0;j++) { if(a[i][j])sum++; //printf("%d ",a[i][j]); } // printf("\n"); } if(sum==0)break; for(int i=1;i<=n;i++) { int sum=0,cnt=0; memset(flag,0,sizeof(flag)); for(int j=1;j<=n;j++) { if(a[i][j]==0)continue; if(!flag[a[i][j]]) { flag[a[i][j]]=1; sum++; if(sum>1)break; cnt=a[i][j]; } } if(sum==1) { int l1=x_vec[i].size(); for(int j=0;j<l1;j++) { if(x_vec[i][j].first==cnt) { ok=1; num[m--]=x_vec[i][j].second; judge[x_vec[i][j].second]=1; break; } } for(int j=1;j<=n;j++) a[i][j]=0; } } for(int i=1;i<=n;i++) { int sum=0,cnt=0; memset(flag,0,sizeof(flag)); for(int j=1;j<=n;j++) { if(a[j][i]==0)continue; if(!flag[a[j][i]]) { flag[a[j][i]]=1; sum++; if(sum>1)break; cnt=a[j][i]; } } if(sum==1) { int l1=y_vec[i].size(); for(int j=0;j<l1;j++) { if(y_vec[i][j].first==cnt) { ok=1; num[m--]=y_vec[i][j].second; judge[y_vec[i][j].second]=1; break; } } for(int j=1;j<=n;j++) { a[j][i]=0; } } } if(ok==0)break;///找不到要退出 } for(int i=1;i<=n;i++) { int l1=x_vec[i].size(); for(int j=0;j<l1;j++) { if(judge[x_vec[i][j].second]==0)num[m--]=x_vec[i][j].second; } l1=y_vec[i].size(); for(int j=0;j<l1;j++) { if(judge[y_vec[i][j].second]==0)num[m--]=y_vec[i][j].second; } } /// printf("##################\n"); for(int i=1;i<=mm;i++) { printf(i==mm?"%d\n":"%d ",num[i]); } } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/lvshubao1314/article/details/47658785