hdu5386
好纠结,5380的贪心到底为什么。
但是这道题是5386的,
参考:http://blog.csdn.net/ms961516792/article/details/47616705
2015.8.29:
这道题的贪心是这样的:假设有一个操作op1,最后的它操作后是某行全变成a1颜色,而在最终状态时,的确这行全是a1,那么就可以把这个操作放在最后,因为即使可行的答案不是这样的,经过这样移动操作后,还是能够成为最终状态的,同理,以此向前寻找,但是注意,确定的某个操作后,它操作的那行或列,要全化为0,因为无论前面把它变成什么颜色,最后一步,总会变成这样,符合要求,所以不重要,一般情况先,从后想前推完后,要和初始状态比较一下,但是这道题确定有答案,所以,就可以省掉比较的那个步骤。
(贪心什么的虽然写起来很痛快,但是证明也是需要功底的,也得有魄力。)
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; #define N 110 #define M 510 int initgrid[N][N]; int goalgrid[N][N]; int x[M],y[M]; char op[M][5]; int ans[M]; int main(){ int t; int n; int 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",&initgrid[i][j]); } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ scanf("%d",&goalgrid[i][j]); } } for(int i=1;i<=m;i++){ scanf("%s",op[i]); scanf("%d%d",&x[i],&y[i]); } for(int cas=1;cas<=m;cas++){ for(int i=1;i<=m;i++){ if(!x[i]){ continue; } if(op[i][0]=='L'){ bool pd=true; int tempx=x[i]; for(int j=1;j<=n;j++){ if(goalgrid[j][tempx]&&goalgrid[j][tempx]!=y[i]){ pd=false; break; } } if(pd==true){ x[i]=0; ans[m-cas+1]=i; for(int j=1;j<=n;j++){ goalgrid[j][tempx]=0; } break; } } else if(op[i][0]=='H'){ bool pd=true; int tempx=x[i]; for(int j=1;j<=n;j++){ if(goalgrid[tempx][j]&&goalgrid[tempx][j]!=y[i]){ pd=false; break; } } if(pd==true){ x[i]=0; ans[m-cas+1]=i; for(int j=1;j<=n;j++){ goalgrid[tempx][j]=0; } break; } } } } for(int i=1;i<=m;i++){ printf("%d\n",ans[i]); } } }