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
这题看了题解后,感觉挺水的。。因为保证有解,所以可以从后面往前推,遇到整行的颜色和其中没有访问过的一个操作一样的时候,就把这一行的数都变为0(即任意颜色,因为前面的颜色会被后面的覆盖),当矩阵全部为0就输出结果。这里如果用set存储的话注意操作符的定义,因为如果定义为x或者y间的比较,可能会把一些相同的操作删除掉,导致WA.
#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; int gra[106][106],c[600]; struct node{ int f,x,y,idx; }b,temp; bool operator <(node a,node b){ return a.idx<b.idx; } set<node>myset; set<node>::iterator it; int main() { int n,m,i,j,T,sum,a,x,y,tot,flag,f,t,flag1,idx,num1; char s[10]; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); sum=n*n; for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ scanf("%d",&a); } } for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ scanf("%d",&gra[i][j]); } } myset.clear(); for(i=1;i<=m;i++){ scanf("%s%d%d",s,&x,&y); if(s[0]=='L'){ b.f=1; } else b.f=0; b.x=x;b.y=y;b.idx=i; myset.insert(b); } t=0; while(1) { //if(myset.size()==0)break;// || sum==0 if(sum==0)break; flag=0; for(it=myset.begin();it!=myset.end();it++){ temp=*it; x=temp.x;y=temp.y;f=temp.f;idx=temp.idx; if(f==1){ flag1=1;tot=0; for(i=1;i<=n;i++){ if(gra[i][x]==0)continue; if(gra[i][x]==y)tot++; else{ flag1=0;break; } } if(tot==0 || flag1==0)continue; flag=1; for(i=1;i<=n;i++){ if(gra[i][x]==0)continue; else {gra[i][x]=0;sum--;} } t++;c[t]=idx; myset.erase(it);break; } else if(f==0){ flag1=1;tot=0; for(i=1;i<=n;i++){ if(gra[x][i]==0)continue; if(gra[x][i]==y)tot++; else{ flag1=0;break; } } if(tot==0 || flag1==0)continue; flag=1; for(i=1;i<=n;i++){ if(gra[x][i]==0)continue; else {gra[x][i]=0;sum--;} } t++;c[t]=idx; myset.erase(it);break; } } if(!flag)break; } for(i=1;i<=m;i++){ flag=0; for(j=1;j<=t;j++){ if(i==c[j]){ flag=1;break; } } if(flag==0){ printf("%d ",i); } } for(i=t;i>=1;i--){ if(i==1)printf("%d\n",c[i]); else printf("%d ",c[i]); } } return 0; } /* 100 3 7 2 2 1 2 3 3 2 1 3 3 2 2 1 1 2 1 1 1 L 2 3 L 1 3 H 2 1 H 3 3 L 4 3 L 3 2 H 3 1 */