洛谷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个方格.每个方格内有一个小灯泡,灯泡的状态有两种(亮或暗).我们可以通过若干操作使魔板从一个状态改变为另一个状态.操作的方式有两 ...
随机推荐
- Android studio导入第三方类库源码以及jar包
新建一个Android项目,项目结构如下: 1.添加第三方类库源码 首先将第三方类库考入与app同级的目录下: 之后,在build.gradle(Moudule:app)下添加编译代码:在seting ...
- Shiro身份认证---转
目录 1. Shro的概念 2. Shiro的简单身份认证实现 3. Shiro与spring对身份认证的实现 前言: Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在 JavaSE 环境 ...
- Selenium-一组元素的定位
一组元素的定位: 有时候我们可能需要定位一组元素,比如一组checkbox,这时候要实现的思路大概为: 先把一组元素识别出来,然后定位你需要的元素 下面是查找多个元素(这些方法将返回一个列表): 方法 ...
- 【Educational Codeforces Round 38】D. Buy a Ticket 堆优化Dijkstra
题意 给定一张无向图,对每个点$i\in S$求$\min_{j\in S} {2\times d(i,j)+a_j}$ 考虑多源多汇最短路会超时,换个角度考虑每个$j$,如果$j=i$,那么答案为$ ...
- es6的foreach循环遍历
forEach forEach是Array新方法中最基本的一个,就是遍历,循环.例如下面这个例子: 结果: 这段代码相当于: for (var k = 0, length = array.length ...
- 跨平台的WebRTC客户端框架:OpenWebRTC
Webrtc的ios框架编译 http://www.th7.cn/Program/IOS/201502/390418.shtml WebRTC in WebKit : http://www.webrt ...
- bzoj3569 DZY Loves Chinese II & bzoj3237 [AHOI2013] 连通图
给一个无向连通图,多次询问,每次询问给 k 条边,问删除这 k 条边后图的连通性,对于 bzoj3237 可以离线,对于 bzoj3569 强制在线 $n,m,q \leq 500000,k \leq ...
- Mybatis generator配置文件及说明
项目采用sring mvc + mybatis 组合,这里简单介绍下mybatis的应用: 我的IDE是STS(Spring + Tool + Suite), 安装Mybatis Generator插 ...
- POJ1112 Team Them Up!
Team them up! Input file teams.in Output file teams.out Your task is to divide a number of persons i ...
- ACM学习历程—HDU4746 Mophues(莫比乌斯)
Description As we know, any positive integer C ( C >= 2 ) can be written as the multiply of some ...