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。(注意:请使用大写字母)

输入输出样例

输入样例#1:

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
输出样例#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 魔板的更多相关文章

  1. 洛谷 P1275 魔板

    P1275 魔板 题目描述 有这样一种魔板:它是一个长方形的面板,被划分成n行m列的n*m个方格.每个方格内有一个小灯泡,灯泡的状态有两种(亮或暗).我们可以通过若干操作使魔板从一个状态改变为另一个状 ...

  2. [洛谷P2730] 魔板 Magic Squares

    洛谷题目链接:魔板 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都 ...

  3. 洛谷P2730 魔板 [广搜,字符串,STL]

    题目传送门 魔板 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都有 ...

  4. 洛谷 P2730 魔板 Magic Squares 解题报告

    P2730 魔板 Magic Squares 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 ...

  5. 洛谷 P2730 魔板 Magic Squares

    P2730 魔板 Magic Squares 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 ...

  6. 洛谷 - P2730 - 魔板 Magic Squares - bfs

    写状态转移弄了很久,老了,不记得自己的数组是怎么标号的了. #include <bits/stdc++.h> using namespace std; #define ll long lo ...

  7. 【题解】魔板—洛谷P1275。

    话说好久没更博了. 最近学了好多知识懒的加进来了. 有幸认识一位大佬. 让我有了继续更博的兴趣. 但这是一个旧的题解. 我在某谷上早就发过的. 拿过来直接用就当回归了吧. 其实这道题有一个特别关键的思 ...

  8. 【洛谷】P1275 魔板(暴力&思维)

    题目描述 有这样一种魔板:它是一个长方形的面板,被划分成n行m列的n*m个方格.每个方格内有一个小灯泡,灯泡的状态有两种(亮或暗).我们可以通过若干操作使魔板从一个状态改变为另一个状态.操作的方式有两 ...

  9. P1275 魔板

    题目描述 有这样一种魔板:它是一个长方形的面板,被划分成n行m列的n*m个方格.每个方格内有一个小灯泡,灯泡的状态有两种(亮或暗).我们可以通过若干操作使魔板从一个状态改变为另一个状态.操作的方式有两 ...

随机推荐

  1. Java_总结_00_资源贴

    1.Java程序员从笨鸟到菜鸟 (http://blog.csdn.net/column/details/java.html) 2. java进阶开发(http://blog.csdn.net/col ...

  2. 第一章 走进Python

    目标 了解Python的历史 了解Python的特征 了解Python的应用 掌握Linux下Python开发环境的搭建 理解Windows下Python环境搭建 案例 安装Python,写出第一个P ...

  3. 关于ATML信号定义的理解-1

    1.XML中的类型标签: <xs:complexType>复合类型和<xs:simpleTyle>简单类型是数据结构类型,包含了各种类型的属性.可以被子类型继承,继承方式为&l ...

  4. codeforces 631B B. Print Check

    B. Print Check time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  5. Gym 101142G : Gangsters in Central City(DFS序+LCA+set)

    题意:现在有一棵树,1号节点是水源,叶子节点是村庄,现在有些怪兽会占领一些村庄(即只占领叶子节点),现在要割去一些边,使得怪兽到不了水源.给出怪兽占领和离开的情况,现在要割每次回答最小的割,使得怪兽不 ...

  6. LOJ2303 「NOI2017」蚯蚓排队

    「NOI2017」蚯蚓排队 题目描述 蚯蚓幼儿园有$n$只蚯蚓.幼儿园园长神刀手为了管理方便,时常让这些蚯蚓们列队表演. 所有蚯蚓用从$1$到$n$的连续正整数编号.每只蚯蚓的长度可以用一个正整数表示 ...

  7. BZOJ3401:[USACO2009MAR]Look Up

    浅谈栈:https://www.cnblogs.com/AKMer/p/10278222.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?id ...

  8. Erlang generic standard behaviours -- summary

    gen_server 相关的片段分析得也差不多了, 这篇作为一个简要的总结.这一系列相关的分析暂且告一段落(之后如有必要,还会回来的 ^^ ),下一个系列主要是以pool 相关, 包括但不仅限于开源项 ...

  9. 优秀开源项目之三:高性能、高并发、高扩展性和可读性的网络服务器架构State Threads

    译文在后面. State Threads for Internet Applications Introduction State Threads is an application library ...

  10. Java常见设计模式之单例模式

         1.何为单例模式? 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的 ...