洛谷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个方格.每个方格内有一个小灯泡,灯泡的状态有两种(亮或暗).我们可以通过若干操作使魔板从一个状态改变为另一个状态.操作的方式有两 ...
随机推荐
- Java企业微信开发_02_通讯录同步
一.本节要点 1.获取通讯录密钥 获取方式: 登录企业微信—>管理工具—>通讯录同步助手—>开启“API接口同步” ; 开启后,即可看到通讯录密钥,也可设置通讯录API的权限:读取 ...
- Linux-NoSQL之Redis(三)
一.Redis数据常用操作 1.string常用操作 set key1 aminglinux get key1 set key1 aming //一个key对应一个value,多次赋值,会覆盖前面 ...
- 201621123014《Java程序设计》第四周学习总结
1.本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 答:继承.多态.子类.父类.final.static.类型判断与类型转换.抽象类. 1.2 尝试使用思维导图将这些关键词组织起来. ...
- 为什么jdk1.8不支持sql.append,该如何解决
StringBuilder sql = new StringBuilder("SELECT ID,COMMAND,DESCRIPTION,CONTENT FROM message where ...
- CF 360 E Levko and Game —— 贪心+最短路
题目:http://codeforces.com/contest/360/problem/E 首先,每条边不是选 \( l[i] \) 就是选 \( r[i] \): 做法就是先把边权都设成 \( r ...
- 2013 蓝桥杯校内选拔赛 java本科B组(题目+答案)
一.标题:正则表示 正则表达式表示了串的某种规则或规律.恰当地使用正则表达式,可以使得代码简洁.事半功倍.java的很多API都支持正则表达式作为参数.其中的String.split就是这样. ...
- 时间倒计时 JS
<div id="keleyi">Christmas Countdown</div> <script type="text/javascri ...
- AI-Info-Micron-Menu:Products
ylbtech-AI-Info-Micron-Menu:Products 我们制造业界最广泛的存储器和存储技术产品组合:DRAM,NAND,NOR和3D XPoint™存储器. 凭借紧密的行业合作伙伴 ...
- UML核心元素--分析类
分析类共有三个:边界类(boundary).控制类(control)和实体类(entity),这些分析类都是类的版型.分析类是跨越需求到设计实现的桥梁. 边界类:从需求向现实的转换过程中,任何两个有交 ...
- 问题:Oracle long 类型l;结果:oracle里long类型的总结
oracle里long类型的总结 1.LONG 数据类型中存储的是可变长字符串,最大长度限制是2GB. 2.对于超出一定长度的文本,基本只能用LONG类型来存储,数据字典中很多对象的定义就是用LONG ...