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:

  1. 2
  2. 3 4
  3. 0 1 0 1
  4. 1 0 0 1
  5. 0 0 0 0
  6. 0 1 0 1
  7. 1 1 0 0
  8. 0 0 0 0
  9. 2 2
  10. 0 0
  11. 0 1
  12. 1 1
  13. 1 1
输出样例#1:

  1. YES
  2. NO
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<map>
  5. #include<queue>
  6. #define maxn 110
  7. #define mod 10000003
  8. using namespace std;
  9. map<string,bool>vis;
  10. int n,m,T,a[];
  11. string t;
  12. string s,cur,nxt;
  13. queue<string>q;
  14. string hash(int x[]){
  15. string res="";
  16. for(int i=;i<=n*m;i++)res+=x[i]+'';
  17. return res;
  18. }
  19. bool bfs(){
  20. while(!q.empty()){
  21. cur=q.front();q.pop();
  22. for(int i=;i<=n;i++){//枚举修改每一行
  23. int w=(i-)*m;
  24. nxt=cur;
  25. for(int j=;j<m;j++){
  26. if(nxt[w+j]=='')nxt[w+j]='';
  27. else nxt[w+j]='';
  28. }
  29. if(nxt==t)return ;
  30. if(!vis[nxt]){
  31. q.push(nxt);
  32. vis[nxt]=;
  33. }
  34. }
  35. for(int i=;i<m;i++){//枚举修改每一列
  36. nxt=cur;
  37. for(int j=;j<m;j++){
  38. if(nxt[i+j*m]=='')nxt[i+j*m]='';
  39. else nxt[i+j*m]='';
  40. }
  41. if(nxt==t)return ;
  42. if(!vis[nxt]){
  43. q.push(nxt);
  44. vis[nxt]=;
  45. }
  46. }
  47. }
  48. return ;
  49. }
  50. int main(){
  51. scanf("%d",&T);
  52. while(T--){
  53. while(!q.empty())q.pop();
  54. s="";t="";
  55. //memset(vis,0,sizeof(vis));
  56. vis.clear();
  57. scanf("%d%d",&n,&m);
  58. for(int i=;i<n*m;i++){
  59. scanf("%d",&a[i]);
  60. s+=a[i]+'';
  61. }
  62. for(int i=;i<n*m;i++){
  63. scanf("%d",&a[i]);
  64. t+=a[i]+'';
  65. }
  66. vis[s]=;
  67. q.push(s);
  68. if(bfs())printf("YES\n");
  69. else printf("NO\n");
  70. }
  71. }

0分 手模不出样例,我自己写的宽搜也没过

  1. /*
  2. 第一步:在最外层循环枚举初始的每一列当做目标状态的第一列
  3. 第二步:在每层循环中比较当前这列和目标状态的第一列的同行的数,如果不相同则把初始的那一行翻转(前面先记录,后面记得还原)
  4. 第三步:看看剩下的列是否可以一一对应,如果可以就yes,不可以就继续枚举。
  5. */
  6. #include<iostream>
  7. #include<cstdio>
  8. #include<cstring>
  9. using namespace std;
  10. #define maxn 110
  11. int n,m,T,s[maxn][maxn],t[maxn][maxn];
  12. bool change_x[maxn],vis_y[maxn];
  13. bool check(int x){
  14. memset(change_x,,sizeof(change_x));
  15. memset(vis_y,,sizeof(vis_y));
  16. for(int i=;i<=n;i++)
  17. if(s[i][x]!=t[i][])
  18. change_x[i]=;//第i行需要翻转
  19. vis_y[x]=;
  20. for(int i=;i<=m;i++){//目标状态的第i列
  21. bool flag=;
  22. for(int j=;j<=m;j++){//初始状态的第j列
  23. if(vis_y[j])continue;
  24. int cnt=;
  25. for(int k=;k<=n;k++){
  26. if((change_x[k]&&s[k][j]!=t[k][i])||(!change_x[k]&&s[k][j]==t[k][i]))cnt++;
  27. else break;
  28. }
  29. if(cnt==n){
  30. vis_y[j]=,flag=;
  31. break;
  32. }
  33. }
  34. if(!flag)return ;
  35. }
  36. return ;
  37. }
  38. int main(){
  39. freopen("Cola.txt","r",stdin);
  40. scanf("%d",&T);
  41. while(T--){
  42. scanf("%d%d",&n,&m);
  43. for(int i=;i<=n;i++)
  44. for(int j=;j<=m;j++)
  45. scanf("%d",&s[i][j]);
  46. for(int i=;i<=n;i++)
  47. for(int j=;j<=m;j++)
  48. scanf("%d",&t[i][j]);
  49. bool flag=;
  50. for(int i=;i<=m;i++){//枚举初始状态的每一列与目标状态对应
  51. int now=check(i);
  52. if(now==){
  53. printf("YES\n");
  54. flag=;break;
  55. }
  56. }
  57. if(!flag)printf("NO\n");
  58. }
  59. }

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企业微信开发_02_通讯录同步

    一.本节要点 1.获取通讯录密钥 获取方式: 登录企业微信—>管理工具—>通讯录同步助手—>开启“API接口同步”  ; 开启后,即可看到通讯录密钥,也可设置通讯录API的权限:读取 ...

  2. Linux-NoSQL之Redis(三)

    一.Redis数据常用操作 1.string常用操作 set key1  aminglinux get key1 set key1  aming //一个key对应一个value,多次赋值,会覆盖前面 ...

  3. 201621123014《Java程序设计》第四周学习总结

    1.本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 答:继承.多态.子类.父类.final.static.类型判断与类型转换.抽象类. 1.2 尝试使用思维导图将这些关键词组织起来. ...

  4. 为什么jdk1.8不支持sql.append,该如何解决

    StringBuilder sql = new StringBuilder("SELECT ID,COMMAND,DESCRIPTION,CONTENT FROM message where ...

  5. CF 360 E Levko and Game —— 贪心+最短路

    题目:http://codeforces.com/contest/360/problem/E 首先,每条边不是选 \( l[i] \) 就是选 \( r[i] \): 做法就是先把边权都设成 \( r ...

  6. 2013 蓝桥杯校内选拔赛 java本科B组(题目+答案)

    一.标题:正则表示     正则表达式表示了串的某种规则或规律.恰当地使用正则表达式,可以使得代码简洁.事半功倍.java的很多API都支持正则表达式作为参数.其中的String.split就是这样. ...

  7. 时间倒计时 JS

    <div id="keleyi">Christmas Countdown</div> <script type="text/javascri ...

  8. AI-Info-Micron-Menu:Products

    ylbtech-AI-Info-Micron-Menu:Products 我们制造业界最广泛的存储器和存储技术产品组合:DRAM,NAND,NOR和3D XPoint™存储器. 凭借紧密的行业合作伙伴 ...

  9. UML核心元素--分析类

    分析类共有三个:边界类(boundary).控制类(control)和实体类(entity),这些分析类都是类的版型.分析类是跨越需求到设计实现的桥梁. 边界类:从需求向现实的转换过程中,任何两个有交 ...

  10. 问题:Oracle long 类型l;结果:oracle里long类型的总结

    oracle里long类型的总结 1.LONG 数据类型中存储的是可变长字符串,最大长度限制是2GB. 2.对于超出一定长度的文本,基本只能用LONG类型来存储,数据字典中很多对象的定义就是用LONG ...