1-4 金币阵列问题


问题描述

有m*n枚金币在桌面上排列成一个m行n列的金币阵列。每一枚金币或正面朝上,或背面朝上。用数字表示金币状态,0表示正面朝上,1表示背面朝上。

金币阵列游戏的规则是:
(1)每次将任一行金币翻过来放在原来的位置上。
(2)每次可以任选2列,交换这2列金币的位置。

任务:给定金币的初始状态和目标状态,编程计算按金币游戏规则,将金币排列从初始状态变换到目标状态所需的最少变换次数。


Java

public class Main {//case 1private static int[][] source = {{1, 0, 1}, {0, 0, 0}, {1, 1, 0}, {1, 0, 1}};private static int[][] target = {{1, 0, 1}, {1, 1, 1}, {0, 1, 1}, {1, 0, 1}};//case 2
//    private static int[][] source = {{1, 0, 1}, {0, 0, 0}, {1, 0, 0}, {1, 1, 1}};
//    private static int[][] target = {{1, 1, 0}, {1, 1, 1}, {0, 1, 1}, {1, 0, 1}};private static int[][] tempMatrix = new int[4][3];private static int rows = 4;private static int columns = 3;private static int count, best=9999;public static void main(String[] args) {int i, j, k;/*思路:一、首先将每一列运用列交换作为第1列,二、然后对每一行进行判断,如果元素与目标元素不相等,则进行行翻转处理,三、最后向后判断后面列是否相同*///一、每一列运用列交换作为第1列for(k=0; k<columns; k++){for(i=0; i<rows; i++)for(j=0; j<columns; j++)tempMatrix[i][j] = source[i][j];count = 0;exchangeColumns(0, k);//二、对每一行进行判断,如果元素与目标元素不相等,则进行行翻转处理for(i=0; i<rows; i++){if(tempMatrix[i][0] != target[i][0])turnoverRow(i);}//三、向后判断后面列是否相同boolean found = true;for(i=0; i<columns; i++){found = false;//1 先判断tempMatrix当前列是否与目标矩阵的当前列相同if(isSameColumns(i, i)){found = true;continue;}//2 tempMatrix当前列与目标矩阵的当前列不相同时,看tempMatrix当前列之后的列是否与目标矩阵当前列相同//  1)若之后有相同的列,则进行列交换操作,继续比较后面的列//  2)若之后也没有相同的列,则说明此次变换不能变换成目标矩阵,进行下一种变换尝试for(j=i+1; j<columns; j++){if(isSameColumns(i, j)){exchangeColumns(i, j);found = true;break;}}if(!found)break;}if(found)best = (count < best) ? count : best;}if(best < 9999)System.out.println("At least "+best+" steps needed to change source to target!");elseSystem.out.println("Can not change source to target!");}//turnover one rowprivate static void turnoverRow(int i){for(int j=0; j<columns; j++)tempMatrix[i][j] = 1-tempMatrix[i][j];count++;}//exchange two columnsprivate static void exchangeColumns(int i, int j){if(i == j)return;for(int k=0; k<rows; k++){int tempValue = tempMatrix[k][i];tempMatrix[k][i] = tempMatrix[k][j];tempMatrix[k][j] = tempValue;}if(i != j)count++;}//check whether two columns are sameprivate static boolean isSameColumns(int i, int j){boolean isSame = true;for(int k=0; k<rows; k++){if(target[k][i] != tempMatrix[k][j]){isSame = false;break;}}return isSame;}
}

Case 1 output

At least 2 steps needed to change source to target!

Case 2 output

Can not change source to target!

Reference

王晓东《计算机算法设计与分析》(第3版)P7-8

算法设计与分析: 1-4 金币阵列问题相关推荐

  1. 【算法设计与分析】经典常考三十三道例题AC代码

    ❥小虾目前大三,我校在大一下开设<数据结构>这门课,大二上开了<算法设计与分析>这门课,很庆幸这两门课的上机考试总成绩一门100,一门99,最后总分也都90+.下文会给出机试的 ...

  2. 算法设计与分析第七章分支限界算法(完结篇)

    算法设计与分析第七章分支限界算法 一.分支界限算法概述 1.分支限界法类似于回溯法,是一种在问题的解空间树上搜索问题解的算法. 分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解 ...

  3. 算法设计与分析: 5-19 世界名画陈列馆问题

    5-19 世界名画陈列馆问题 问题描述 世界名画陈列馆由 m×nm×n m \times n 个排列成矩形阵列的陈列室组成.为了防止名画被盗,需要在陈列室中设置警卫机器人哨位.每个警卫机器人除了监视它 ...

  4. 算法设计与分析: 6-24 最长距离问题

    6-24 最长距离问题 问题描述 重排九宫是一个古老的单人智力游戏.据说重排九宫起源于我国古时由三国演义故事"关羽义释曹操"而设计的智力玩具"华容道",后来流传 ...

  5. 算法设计与分析: 6-23 重排n²宫问题

    6-23 重排n²宫问题 问题描述 重排九宫是一个古老的单人智力游戏.据说重排九宫起源于我国古时由三国演义故事"关羽义释曹操"而设计的智力玩具"华容道",后来流 ...

  6. 计算机算法设计与分析期末试题,算法设计与分析期末考试试卷(D卷)(含答案).doc...

    算法设计与分析期末考试试卷(D卷) 一.选择题(0分,每题分) .D A.n2/2 + 2n的渐进表达式上界函数是O(2n) B.n2/2 + 2n的渐进表达式下界函数是Ω(2n) C.logn3的渐 ...

  7. 算法设计与分析课程的时间空间复杂度

    算法设计与分析课程的时间空间复杂度: 总结 算法 时间复杂度 空间复杂度 说明 Hanoi $ O(2^n) $ $ O(n) $ 递归使用 会场安排问题 \(O(nlogn)\) \(O(n)\) ...

  8. 哈工大威海算法设计与分析_计算机算法设计与分析第一章 算法概述

    晓强Deep Learning的读书分享会,先从这里开始,从大学开始.大家好,我是晓强,计算机科学与技术专业研究生在读.我会不定时的更新我的文章,内容可能包括深度学习入门知识,具体包括CV,NLP方向 ...

  9. PHP第五周答案,算法设计与分析第五周作业——Word Ladder

    算法设计与分析第五周作业--Word Ladder 上周找了一道深度搜索优先搜索的算法题来做,于是这周就选了一道广度优先搜索算法题来试试手. 本周所选题目:原题目链接 题目详情 题目大意:给出一个字符 ...

最新文章

  1. Activity的启动模式与flag详解
  2. linux nginx 代理iis,nginx 系列 linux下安装以及配置IIS分发
  3. java学习(33):巩固练习
  4. unoconv 在线预览 doc,doxc,xls,xlsx,ppt,pptx 文件功能环境搭建
  5. django 集成个推_Django动态添加定时任务之djangocelery的使用
  6. leetcode两数之和,三数之和,四数之和问题
  7. 第十二届蓝桥杯真题-左孩 子右兄弟(dfs)
  8. 【Excel从头开始】-2 快速填充/快速分析
  9. python 极坐标图_Python中的极坐标图问题,未考虑角度
  10. Cocos2dx - 缓动Action
  11. GeeM2引擎弹出装备显示框的设置方法
  12. C++ 异常处理机制的实现
  13. 【英语学习工具】解说 LeHoCat 提供免费的 视频集制作工具 使用方法, 看视频学英语的制作工具, 制作英语教学课件的工具, 帮助自学英语(详细图文解说)
  14. 浅谈晏殊几何学知识图谱技术
  15. ReentrantLock 实现原理笔记(一)
  16. ajax查询全国天气预报,使用聚合数据api接口
  17. 操作Excel导入的问题(转)
  18. 快餐行业进入“黄金时代”,左手天堂右手地狱
  19. python携程酒店评论_python爬取携程景点评论信息
  20. qt emit是什么意思_2020年11月12日 无赞赏QT吗哪 :一同站在福音之上的祷告同工...

热门文章

  1. 32位PNG有损压缩为8位
  2. 有关REST的一些内容
  3. Android离线人脸识别方案对比
  4. 物联网开发笔记(30)- 使用Micropython开发ESP32开发板之控制240x240的oled屏幕显示二维码(ST7789芯片)
  5. 为何晶振并联一个1MΩ电阻?晶振低温不起振如何解决?
  6. Linux网卡重命名规则
  7. 风影ASP.NET基础教学 9 数据访问
  8. 两点告诉您品牌控价(管控低价乱价)的重要性
  9. 【我们就爱穿上古着晒幸福】
  10. 找回被删除的 Git Stashes