洛谷P1275 魔板
P1275 魔板
题目描述
有这样一种魔板:它是一个长方形的面板,被划分成n行m列的n*m个方格。每个方格内有一个小灯泡,灯泡的状态有两种(亮或暗)。我们可以通过若干操作使魔板从一个状态改变为另一个状态。操作的方式有两种:
(1)任选一行,改变该行中所有灯泡的状态,即亮的变暗、暗的变亮;
(2)任选两列,交换其位置。
当然并不是任意的两种状态都可以通过若干操作来实现互相转化的。
你的任务就是根据给定两个魔板状态,判断两个状态能否互相转化。
输入输出格式
输入格式:
文件中包含多组数据。第一行一个整数k,表示有k组数据。
每组数据的第一行两个整数n和m。(0<n,m≤100)
以下的n行描述第一个魔板。每行有m个数字(0或1),中间用空格分隔。若第x行的第y个数字为0,则表示魔板的第x行y列的灯泡为“亮”;否则为“暗”。
然后的n行描述第二个魔板。数据格式同上。
任意两组数据间没有空行。
输出格式:
共k行,依次描述每一组数据的结果。
若两个魔板可以相互转化,则输出YES,否则输出NO。(注意:请使用大写字母)
输入输出样例
2
3 4
0 1 0 1
1 0 0 1
0 0 0 0
0 1 0 1
1 1 0 0
0 0 0 0
2 2
0 0
0 1
1 1
1 1
YES
NO
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<queue>
#define maxn 110
#define mod 10000003
using namespace std;
map<string,bool>vis;
int n,m,T,a[];
string t;
string s,cur,nxt;
queue<string>q;
string hash(int x[]){
string res="";
for(int i=;i<=n*m;i++)res+=x[i]+'';
return res;
}
bool bfs(){
while(!q.empty()){
cur=q.front();q.pop();
for(int i=;i<=n;i++){//枚举修改每一行
int w=(i-)*m;
nxt=cur;
for(int j=;j<m;j++){
if(nxt[w+j]=='')nxt[w+j]='';
else nxt[w+j]='';
}
if(nxt==t)return ;
if(!vis[nxt]){
q.push(nxt);
vis[nxt]=;
}
}
for(int i=;i<m;i++){//枚举修改每一列
nxt=cur;
for(int j=;j<m;j++){
if(nxt[i+j*m]=='')nxt[i+j*m]='';
else nxt[i+j*m]='';
}
if(nxt==t)return ;
if(!vis[nxt]){
q.push(nxt);
vis[nxt]=;
}
}
}
return ;
}
int main(){
scanf("%d",&T);
while(T--){
while(!q.empty())q.pop();
s="";t="";
//memset(vis,0,sizeof(vis));
vis.clear();
scanf("%d%d",&n,&m);
for(int i=;i<n*m;i++){
scanf("%d",&a[i]);
s+=a[i]+'';
}
for(int i=;i<n*m;i++){
scanf("%d",&a[i]);
t+=a[i]+'';
}
vis[s]=;
q.push(s);
if(bfs())printf("YES\n");
else printf("NO\n");
}
}
0分 手模不出样例,我自己写的宽搜也没过
/*
第一步:在最外层循环枚举初始的每一列当做目标状态的第一列
第二步:在每层循环中比较当前这列和目标状态的第一列的同行的数,如果不相同则把初始的那一行翻转(前面先记录,后面记得还原)
第三步:看看剩下的列是否可以一一对应,如果可以就yes,不可以就继续枚举。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 110
int n,m,T,s[maxn][maxn],t[maxn][maxn];
bool change_x[maxn],vis_y[maxn];
bool check(int x){
memset(change_x,,sizeof(change_x));
memset(vis_y,,sizeof(vis_y));
for(int i=;i<=n;i++)
if(s[i][x]!=t[i][])
change_x[i]=;//第i行需要翻转
vis_y[x]=;
for(int i=;i<=m;i++){//目标状态的第i列
bool flag=;
for(int j=;j<=m;j++){//初始状态的第j列
if(vis_y[j])continue;
int cnt=;
for(int k=;k<=n;k++){
if((change_x[k]&&s[k][j]!=t[k][i])||(!change_x[k]&&s[k][j]==t[k][i]))cnt++;
else break;
}
if(cnt==n){
vis_y[j]=,flag=;
break;
}
}
if(!flag)return ;
}
return ;
}
int main(){
freopen("Cola.txt","r",stdin);
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%d",&s[i][j]);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%d",&t[i][j]);
bool flag=;
for(int i=;i<=m;i++){//枚举初始状态的每一列与目标状态对应
int now=check(i);
if(now==){
printf("YES\n");
flag=;break;
}
}
if(!flag)printf("NO\n");
}
}
100分
洛谷P1275 魔板的更多相关文章
- 洛谷 P1275 魔板
P1275 魔板 题目描述 有这样一种魔板:它是一个长方形的面板,被划分成n行m列的n*m个方格.每个方格内有一个小灯泡,灯泡的状态有两种(亮或暗).我们可以通过若干操作使魔板从一个状态改变为另一个状 ...
- [洛谷P2730] 魔板 Magic Squares
洛谷题目链接:魔板 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都 ...
- 洛谷P2730 魔板 [广搜,字符串,STL]
题目传送门 魔板 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都有 ...
- 洛谷 P2730 魔板 Magic Squares 解题报告
P2730 魔板 Magic Squares 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 ...
- 洛谷 P2730 魔板 Magic Squares
P2730 魔板 Magic Squares 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 ...
- 洛谷 - P2730 - 魔板 Magic Squares - bfs
写状态转移弄了很久,老了,不记得自己的数组是怎么标号的了. #include <bits/stdc++.h> using namespace std; #define ll long lo ...
- 【题解】魔板—洛谷P1275。
话说好久没更博了. 最近学了好多知识懒的加进来了. 有幸认识一位大佬. 让我有了继续更博的兴趣. 但这是一个旧的题解. 我在某谷上早就发过的. 拿过来直接用就当回归了吧. 其实这道题有一个特别关键的思 ...
- 【洛谷】P1275 魔板(暴力&思维)
题目描述 有这样一种魔板:它是一个长方形的面板,被划分成n行m列的n*m个方格.每个方格内有一个小灯泡,灯泡的状态有两种(亮或暗).我们可以通过若干操作使魔板从一个状态改变为另一个状态.操作的方式有两 ...
- P1275 魔板
题目描述 有这样一种魔板:它是一个长方形的面板,被划分成n行m列的n*m个方格.每个方格内有一个小灯泡,灯泡的状态有两种(亮或暗).我们可以通过若干操作使魔板从一个状态改变为另一个状态.操作的方式有两 ...
随机推荐
- noip退役赛
上下午 6 题一起考 自闭了 T1 小明要参加一场比赛,赛制给你一个表格 $p$ ,$p_{(i,j)}$ 表示他在第 $i$ 场比赛前如果输了 $j$ 场,他这一场赢的概率,他也可以故意输掉任意多场 ...
- bzoj5329 战略游戏
有一个圆方树,每次给出一个点集,询问虚树上圆点数量-询问点数量 sol:题意读懂就很简单了...可以建虚树dp 也可以考虑每一条链对答案的贡献,最后要注意单独计算虚树根对答案的贡献 #pragma G ...
- bzoj 2732: [HNOI2012]射箭 半平面交
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=2732 题解: 这道题的做法我不想说什么了... 其他题解都有说做法... 即使是我上午做 ...
- 使用IronPython集成Python和.NET
本文由 伯乐在线 - 艾凌风 翻译,Daetalus 校稿.未经许可,禁止转载!英文出处:www.informit.com.欢迎加入翻译组. 从两个优秀的世界各取所需,更高效的复用代码.想想就醉了,. ...
- [转]jQuery.extend 函数详解
JQuery的extend扩展方法: Jquery的扩展方法extend是我们在写插件的过程中常用的方法,该方法有一些重载原型,在此,我们一起去了解了解. 一.Jquery的扩展方 ...
- JAVA中重写equals()方法为什么要重写hashcode()方法说明
重写hashCode()时最重要的原因就是:无论何时,对同一个对象调用hashCode()都应该生成同样的值.如果在将一个对象用put()方法添加进HashMap时产生一个hashCode()值,而用 ...
- HDU1042(N!:设4为基数)
N! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Submi ...
- loadrunner的四个主要部件
1.VUser Generator :性能脚本开发 2.Controller :提供多线程并发操作 3.Analysis :结果分析 4.Load Generator :负载生成器 ***负载生成器完 ...
- C基础题-sizeof
sizeof C语言中判断数据类型或者表达式长度符:关键字:字节数的计算在程序编译时进行,而不是在程序执行的过程中才计算出来! 一.关于sizeof简单的总结 1.sizeof的使用形式:sizeo ...
- python 开发微信 自定义菜单
1.再次重复说明,下面代码只是为了简单说明接口获取方式.实际中并不推荐,尤其是业务繁重的公众号,更需要中控服务器,统一的获取accessToken. vim basic.py #name: basic ...