算法设计与分析: 1-4 金币阵列问题
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 金币阵列问题相关推荐
- 【算法设计与分析】经典常考三十三道例题AC代码
❥小虾目前大三,我校在大一下开设<数据结构>这门课,大二上开了<算法设计与分析>这门课,很庆幸这两门课的上机考试总成绩一门100,一门99,最后总分也都90+.下文会给出机试的 ...
- 算法设计与分析第七章分支限界算法(完结篇)
算法设计与分析第七章分支限界算法 一.分支界限算法概述 1.分支限界法类似于回溯法,是一种在问题的解空间树上搜索问题解的算法. 分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解 ...
- 算法设计与分析: 5-19 世界名画陈列馆问题
5-19 世界名画陈列馆问题 问题描述 世界名画陈列馆由 m×nm×n m \times n 个排列成矩形阵列的陈列室组成.为了防止名画被盗,需要在陈列室中设置警卫机器人哨位.每个警卫机器人除了监视它 ...
- 算法设计与分析: 6-24 最长距离问题
6-24 最长距离问题 问题描述 重排九宫是一个古老的单人智力游戏.据说重排九宫起源于我国古时由三国演义故事"关羽义释曹操"而设计的智力玩具"华容道",后来流传 ...
- 算法设计与分析: 6-23 重排n²宫问题
6-23 重排n²宫问题 问题描述 重排九宫是一个古老的单人智力游戏.据说重排九宫起源于我国古时由三国演义故事"关羽义释曹操"而设计的智力玩具"华容道",后来流 ...
- 计算机算法设计与分析期末试题,算法设计与分析期末考试试卷(D卷)(含答案).doc...
算法设计与分析期末考试试卷(D卷) 一.选择题(0分,每题分) .D A.n2/2 + 2n的渐进表达式上界函数是O(2n) B.n2/2 + 2n的渐进表达式下界函数是Ω(2n) C.logn3的渐 ...
- 算法设计与分析课程的时间空间复杂度
算法设计与分析课程的时间空间复杂度: 总结 算法 时间复杂度 空间复杂度 说明 Hanoi $ O(2^n) $ $ O(n) $ 递归使用 会场安排问题 \(O(nlogn)\) \(O(n)\) ...
- 哈工大威海算法设计与分析_计算机算法设计与分析第一章 算法概述
晓强Deep Learning的读书分享会,先从这里开始,从大学开始.大家好,我是晓强,计算机科学与技术专业研究生在读.我会不定时的更新我的文章,内容可能包括深度学习入门知识,具体包括CV,NLP方向 ...
- PHP第五周答案,算法设计与分析第五周作业——Word Ladder
算法设计与分析第五周作业--Word Ladder 上周找了一道深度搜索优先搜索的算法题来做,于是这周就选了一道广度优先搜索算法题来试试手. 本周所选题目:原题目链接 题目详情 题目大意:给出一个字符 ...
最新文章
- Activity的启动模式与flag详解
- linux nginx 代理iis,nginx 系列 linux下安装以及配置IIS分发
- java学习(33):巩固练习
- unoconv 在线预览 doc,doxc,xls,xlsx,ppt,pptx 文件功能环境搭建
- django 集成个推_Django动态添加定时任务之djangocelery的使用
- leetcode两数之和,三数之和,四数之和问题
- 第十二届蓝桥杯真题-左孩 子右兄弟(dfs)
- 【Excel从头开始】-2 快速填充/快速分析
- python 极坐标图_Python中的极坐标图问题,未考虑角度
- Cocos2dx - 缓动Action
- GeeM2引擎弹出装备显示框的设置方法
- C++ 异常处理机制的实现
- 【英语学习工具】解说 LeHoCat 提供免费的 视频集制作工具 使用方法, 看视频学英语的制作工具, 制作英语教学课件的工具, 帮助自学英语(详细图文解说)
- 浅谈晏殊几何学知识图谱技术
- ReentrantLock 实现原理笔记(一)
- ajax查询全国天气预报,使用聚合数据api接口
- 操作Excel导入的问题(转)
- 快餐行业进入“黄金时代”,左手天堂右手地狱
- python携程酒店评论_python爬取携程景点评论信息
- qt emit是什么意思_2020年11月12日 无赞赏QT吗哪 :一同站在福音之上的祷告同工...