hdu5386(暴力)
题意:
给出两个n*n的矩阵,一个作为初始矩阵。一个作为目标矩阵,给出m个操作,操作有两种,一种是“L,x,y”。代表我们要把x这一行赋成y,还有一种是“H,x,y”,代表要把x这一列赋成y。问我们怎样安排这些操作才干把初始矩阵转化成目标矩阵。输出方案。special judge
思路:
首先明白一点,初始矩阵是没实用的~,依照题解的说法。我们能够按顺序枚举全部操作,假设是L操作,我们就在目标矩阵中找一行都是y的。把这一行都更成0,同一时候把答案更新,如此往复,直至我们得到一种方案。
附上题解代码(绍兴一中的):
#include <stdio.h> #include <stdlib.h> using namespace std; int T,n,m,t,i,j,k,l; int a[105][105],b[505],c[505],ans[505]; char opt[505],ch; int main() { scanf("%d",&T); for(;T;--T) { scanf("%d%d",&n,&m);t=0; for(i=1;i<=n;++i) for(j=1;j<=n;++j) scanf("%d",&a[i][j]); for(i=1;i<=n;++i) for(j=1;j<=n;++j) scanf("%d",&a[i][j]); for(i=1;i<=m;++i) { for(ch=getchar();ch!='H'&&ch!='L';ch=getchar()); opt[i]=ch;scanf("%d%d",&b[i],&c[i]); } for(;t<m;) { for(i=1;i<=m;++i) if(b[i]) { k=b[i]; if(opt[i]=='L') { for(j=1;j<=n;++j) if(a[j][k]&&a[j][k]!=c[i]) break; if(j>n) { ans[++t]=i;b[i]=0; for(j=1;j<=n;++j)a[j][k]=0; } } else { for(j=1;j<=n;++j) if(a[k][j]&&a[k][j]!=c[i]) break; if(j>n) { ans[++t]=i;b[i]=0; for(j=1;j<=n;++j)a[k][j]=0; } } } } for(i=m;i>=1;--i)printf("%d ",ans[i]); printf("\n"); } }