0
点赞
收藏
分享

微信扫一扫

HDU 5386 Cover (MUT #8 模拟暴力)


【题目链接】:​​click here~~​​

【题意】:

操作L x y,把当前x,这一列全部置为y 
操作H x y,把当前,这一行全部置为y。 
现在给你n?n的初始矩阵,以及n?n的目标矩阵 
现在给你m种操作(由以上两种操作构成),问怎么排序这m种操作,才能使得,初始矩阵,经由排序后的操作,构成目标矩阵。 
输出排序方案。

也就是给出初始矩阵和目标矩阵,存在m中操作,可以分别把每行或者每列都涂成同一种颜色,数据保证有解,因为保证有解,(然而初始矩阵并没有什么卵用。。。)
【思路】:

暴力寻找M次操作,若目标矩阵的行或列全和该操作的颜色一样,则最后进行此操作,并把所有涂的点涂为颜色0(可当任意颜色)
然后同样依次推出之前的操作,因为之后的操作会覆盖掉之前操作的点。

PS:比赛当时居然又忽略了,
代码:

#include<bits/stdc++.h>
using namespace std;
const int N=505;
int goal[N][N];
int n,m;
inline int read(){
int c=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){c=c*10+ch-'0';ch=getchar();}
return c*f;
}
struct node{
char op;
int x,y;
} mat[N];
char s[2];
int ans[N];
int main(){
int i,j,t;
t=read();
while(t--){
memset(goal,0,sizeof(goal));
memset(ans,0,sizeof(ans));
int cnt,num;
n=read();m=read();
for( i=1; i<=n; ++i)
for(j=1; j<=n; ++j)goal[i][j]=read();
for(i=1; i<=n; ++i)
for(j=1; j<=n; ++j)goal[i][j]=read();
for(i=1; i<=m; ++i){
scanf("%s %d %d",s,&mat[i].x,&mat[i].y);
mat[i].op=s[0];
}
cnt=m;
int c1,c2,fH=0,fL=0;
while(cnt!=0){
for(i=1; i<=m; ++i){
if(mat[i].x!=0){
c1=mat[i].x;
c2=mat[i].y;
if(mat[i].op=='H'){
for(j=1; j<=n; j++)
if(goal[c1][j]!=0&&goal[c1][j]!=c2) break;
if(j==n+1){
for(int k=1; k<=n; k++)
goal[c1][k]=0;
ans[cnt--]=i;
mat[i].x=0;
}
}
else{
for(j=1; j<=n; j++)
if(goal[j][c1]!=0&&goal[j][c1]!=c2) break;
if(j==n+1){
for(int k=1; k<=n; k++)
goal[k][c1]=0;
ans[cnt--]=i;
mat[i].x=0;
}
}
}
}
}
for(i=1; i<=m; i++)
printf("%d ",ans[i]);
puts("");
}
return 0;
}



举报

相关推荐

0 条评论