【Java】棋盘覆盖问题
棋盘覆盖问题抓住两点即可:
1.我们将一个大棋盘C分为四块,C的左上角是坐标是(0,0)
这个左上角坐标是用来区分在哪一个小棋盘的,抓住这个左上角的坐标变化
2.我们需要将没有特殊数字的其他三块继续分治,但是他没有特殊数字,
如果在第一象限,则将右下作为特殊
如果在第二象限,则将左下作为特殊
如果在第三象限,则将右上作为特殊
如果在第四象限,则将左上作为特殊
抓住这两点,问题则迎刃而解
代码:
import java.util.Scanner;public class ChessBoard {
/** 题目描述:在一个n×n (n = 2k)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。 在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。 *//**
输入
多组测试用例,每组测试用例包括两部分, 第一部分为方格的宽度n, 第二部分则为方格,特殊方格为-1,其他方格为0。 */static int number=1;public static void main(String[] args) {Scanner sc=new Scanner(System.in);int n=sc.nextInt();int array[][]=new int[n][n];int dr=0;int dc=0;for(int i=0;i<n;i++) {for(int j=0;j<n;j++) {array[i][j]=sc.nextInt();if(array[i][j]==-1) {dr=i;//将特殊数字的坐标传给函数dc=j;}}}chessboard(0,0,dr,dc,n,array);//默认左上角是0,0,-1是特殊数字for(int i=0;i<n;i++) {for(int j=0;j<n;j++) {System.out.print(array[i][j]+" ");}System.out.println();}}private static void chessboard(int i, int j, int dr, int dc, int n, int[][] array) {// TODO Auto-generated method stubif(n==1) {return;//如果只有一个数,就返回}int halfsize=n/2;int t=number++;//这个时候number等于1;做完这一步才变成2;if(dr<i+halfsize&&dc<j+halfsize) {chessboard(i,j,dr,dc,halfsize,array);}else {array[i+halfsize-1][j+halfsize-1]=t;chessboard(i,j,i+halfsize-1,j+halfsize-1,halfsize,array);}if(dr<i+halfsize&&dc>=j+halfsize) {chessboard(i,j+halfsize,dr,dc,halfsize,array);}else {array[i+halfsize-1][j+halfsize]=t;chessboard(i,j+halfsize,i+halfsize-1,j+halfsize,halfsize,array);}if(dr>=i+halfsize&&dc<j+halfsize) {chessboard(i+halfsize,j,dr,dc,halfsize,array);}else {array[i+halfsize][j+halfsize-1]=t;chessboard(i+halfsize,j,i+halfsize,j+halfsize-1,halfsize,array);}if(dr>=i+halfsize&&dc>=j+halfsize) {chessboard(i+halfsize,j+halfsize,dr,dc,halfsize,array);}else {array[i+halfsize][j+halfsize]=t;chessboard(i+halfsize,j+halfsize,i+halfsize,j+halfsize,halfsize,array);}
}}
【Java】棋盘覆盖问题相关推荐
- java实现棋盘覆盖算法,java 棋盘覆盖算法
import java.util.Scanner; /** 棋盘覆盖 */ public class Arithmetic { /** 被覆盖后显示的数字,会根据覆盖的顺序有所递增 */ privat ...
- java棋盘覆盖_棋盘覆盖问题实现
[实例简介] 实现棋盘覆盖问题 [实例截图] [核心代码] public static void chessBoard(int dr, int dc, int tr, int tc, int size ...
- java棋盘覆盖分治法,棋盘覆盖-分治法
信 息 工 程 学 院 算法分析 实习报告 学院:信息工程学院 班级:软件工程083 姓名: 学号: 成绩: 一.实习题目 : 棋盘覆盖 二.实习过程 : 1.了解分治法的思想: 将一个难以解决的大问 ...
- java棋盘覆盖分治法_【单选题】实现棋盘覆盖算法利用的算法是( )
A. 分治法 B. 动态规划法 C. 贪心法 D. 回溯法...
1毫居里(1mCi)=()Bq.A.3.7×107B.3.7×108C.3.7×109D.3.7×1010 为了尽可能提高反应堆的总输出功率,就需要进行功率展平,功率展平主要措施有().A.燃料元件分 ...
- JAVA大数_棋盘覆盖
第一道: 传送门:NYOJ 45 棋盘覆盖 2^k*2^k=4^k,其实就是大数计算,-1后取3的倍数.问题本源出自<计算机算法设计与分析>的棋盘覆盖问题,原始解法是分治法,递推出公式f( ...
- java棋盘问题_0x03大数问题(JAVA解决棋盘覆盖,A+B Problem II)
常见的有棋盘覆盖和A+B问题,这类问题牵扯到的数值都比较大,如果用一般的数值类型,肯定输出不了,所以就要想一个办法,怎么把大数转换一下输出. A+B Problem II 时间限制:3000 ms | ...
- 棋盘覆盖(java实现)
6.2 棋盘覆盖 1.问题描述 在一个2k×2k 个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘.在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给 ...
- 棋盘覆盖算法java_棋盘覆盖问题(算法分析)(Java版)
1.问题描述: 在一个2k×2k个方格组成的棋盘中,若有一个方格与其他方格不同,则称该方格为一特殊方格,且称该棋盘为一个特殊棋盘.显然特殊方格在棋盘上出现的位置有种情形.因而对任何 k≥0,有4k种不 ...
- 棋盘覆盖(Java)
棋盘覆盖(Java) 一.问题描述 在一个 2^k * 2^k 方格组成的棋盘中,若恰有一个方格与其它方格不同,则称该方格为一个特殊方格,且称该棋盘为一个特殊棋盘.用4种不同形态的L型骨牌覆盖一个给定 ...
最新文章
- 调查报告:工人们并不担心将来会被AI取代
- 【综述专栏】自动驾驶中可解释AI的综述和未来研究方向
- Windows Socket 最大连接数
- 如何快速转化PSD为UI界面?
- Redis两种客户端:lettuce和Jedis的区别
- php报表数据打印机,通过打印机打印带打印功能的php表
- 区块链技术的发展现状_区块链的现状及其发展趋势
- Spark 学习(十一) spark使用hive的元数据信息
- 力扣78. 子集(JavaScript)
- HDU 6184 2017广西邀请赛:Counting Stars(三元环)
- java 到异常_java编程中遇到的异常以及异常的一些处理
- ios刻录软件_好用免费的剪辑软件神器可以剪辑、导出,让大家都变成为大师级!...
- GAMBIT、ICEM、HYPERMESH耦合面的处理方法
- 网易云音乐(纯CSS实战)
- php gethostbyname ipv6,支持IPV6方法
- 计算机应用基础教育教学工作总结,计算机应用基础教学工作总结
- [转] 教师的备课主要解决哪些问题?
- Is necessary to close fille in python?
- 荣耀v40轻奢版和华为nova8的区别 哪个好
- 初中高中生用计算机,中学生如何科学的使用计算器?