`

棋盘覆盖问题

阅读更多

 


 

 

算法分析,以4*4的方格为例,特殊方格只能在左上,右上,左下,右下四个区间中的一个。排列形式可能是如下几种

1)特殊方格在左上区域,那么其他几个区域的特殊方格可定,一定分布方式如下,用1标识其他几个区域的特殊方格

 

 

 

 

 

 

 

1

 

 

1

1

 

 

 

 

 

 2)特殊方格在右上区域,那么其他几个区域的特殊方格可定,一定分布方式如下,用1标识其他几个区域的特殊方格

 

 

 

 

 

 

1

 

 

 

1

1

 

 

 

 

 

3)特殊方格在左下区域,那么其他几个区域的特殊方格可定,一定分布方式如下,用1标识其他几个区域的特殊方格

 

 

 

 

 

 

1

1

 

 

 

1

 

 

 

 

 

4)特殊方格在右下区域,那么其他几个区域的特殊方格可定,一定分布方式如下,用1标识其他几个区域的特殊方格

 

 

 

 

 

1

1

 

 

1

 

 

 

 

 

 

因此问题分解为特殊方格在一个区域,其余三个1分别变成三个不同区域的特殊方格,确定这三个方格的位置后,再分别对这四个区域进行递归解决子问题直到问题的解为最小解。

代码:

 

//棋盘覆盖问题,by lilywangcn
public class CheckBoard {
	private static int size=3;
	private static int edge=power(2,size);
	private static int[][] board=new int[edge][edge];
	private static int tile=1;
	public static void main(String[] args){
		int x=1;
		int y=1;
		board[x][y]=-1;  //设置第x行,第y列为特殊方格
		print();
		checkboard(0,0,x,y,size);
		System.out.println("after:");
		print();
	}
	
	
	public static void checkboard(int tr, int tc, int dr,int dc, int size){
		if(size==1) return ;
		else{
			size=size-1;
			int edge=power(2,size);
			
			if(dr<tr+edge&&dc<tc+edge){ //特殊方格在左上区域
				checkboard(tr,tc,dr,dc,size);
			}else{
				board[tr+edge-1][tc+edge-1]=tile;  //特殊方格不在左上区域,确定左上区域的特殊方格
				checkboard(tr,tc,tr+edge-1,tc+edge-1,size);
			}
			
			//右上区域
			if(dr<tr+edge&&dc>=tc+edge){
				checkboard(tr,tc+edge,dr,dc,size);
			}else{
				board[tr+edge-1][tc+edge]=tile;
				checkboard(tr,tc+edge,tr+edge-1,tc+edge,size);
			}
			
			//左下区域
			if(dr>=tr+edge&& dc<tc+edge){
				checkboard(tr+edge,tc,dc,dr,size);
			}else{
				board[tr+edge][tc+edge-1]=tile;
				checkboard(tr+edge,tc,tr+edge,tc+edge-1,size);
			}
			
			//右下区域
			if(dr>=tr+edge&& dc>=tc+edge){
				checkboard(tr+edge,tc+edge,dc,dr,size);
			}else{
				board[tr+edge][tc+edge]=tile;
				checkboard(tr+edge,tc+edge,tr+edge,tc+edge,size);
			}
			
			tile++;
		//	System.out.println("tile:" +tile);
		//	print();
		}
	}
	private static void print(){
		for(int i=0;i<edge;i++){
			for(int j=0;j<edge;j++)
			{
				System.out.print(board[i][j]+ " ");
			}
			System.out.println("");
		}
	}
	private static int power(int a,int o){
		int result=1;
		for(int i=0;i<o;i++)
			result*=a;
		return result;
	}
}

 

 运行结果:

size=2的时候:4*4=16

 

 

0 0 0 0 

0 -1 0 0 

0 0 0 0 

0 0 0 0 

after :

0 0 0 0 

0 -1 1 0 

0 1 1 0 

0 0 0 0 

 

size=3的时候:8*8=64;

 

0 0 0 0 0 0 0 0 

0 -1 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 

after:

0 0 0 0 0 0 0 0 

0 -1 1 0 0 2 2 0 

0 1 1 0 0 0 2 0 

0 0 0 0 2 0 0 0 

0 0 0 3 4 0 0 0 

0 3 0 0 0 0 4 0 

0 3 3 0 0 4 4 0 

0 0 0 0 0 0 0 0 

 


 

 

 

 

  • 大小: 179.9 KB
分享到:
评论

相关推荐

    棋盘覆盖问题 算法设计

    ### 棋盘覆盖问题与算法设计 #### 一、问题背景及定义 **棋盘覆盖问题**是指:给定一个大小为 \(2^n \times 2^n\) 的棋盘,其中有一个单元格被挖掉(称为缺陷单元),要求用L型骨牌(即由3个相连的单元格组成的...

    算法设计与分析(用分治法求解棋盘覆盖问题)

    **算法设计与分析——棋盘覆盖问题的分治法求解** 在计算机科学中,算法设计与分析是核心部分,它涉及到如何有效地解决问题并优化计算效率。本篇将重点探讨如何利用分治策略来解决棋盘覆盖问题。棋盘覆盖问题是一个...

    棋盘覆盖问题实现

    ### 棋盘覆盖问题实现 #### 一、问题背景及定义 棋盘覆盖问题是一个经典的计算机科学问题,它涉及到如何用特定形状的瓷砖(通常为L形三块方格的瓷砖)覆盖一个缺失了一个方格的大棋盘。具体而言,假设有一个\(2^n ...

    西南交通大学算法分析与设计实验报告 - 棋盘覆盖问题.docx

    《棋盘覆盖问题》 棋盘覆盖问题是一个典型的算法设计问题,源于计算机科学中的组合优化领域,具有重要的理论和实际意义。在这个问题中,我们面对的是一个2^k * 2^k的棋盘,其中有一个特殊的方格,目标是用四种不同...

    棋盘覆盖问题(可视化)

    棋盘覆盖问题是显示生活中的一个重要的应用,并且是可视化的,现在拿出来与大家分享哦

    棋盘覆盖问题的实现

    ### 棋盘覆盖问题详解 #### 一、问题背景及定义 棋盘覆盖问题是计算机科学中的一个经典问题,涉及到递归算法的应用。该问题要求使用特定形状的骨牌(通常为 L 形)来完全覆盖一个有特殊标记的 n×n 的棋盘,除了...

    JAVA实现棋盘覆盖问题

    ### JAVA 实现棋盘覆盖问题 #### 知识点概览 1. **分治法在算法设计中的应用** 2. **棋盘覆盖问题的概念及其解决策略** 3. **递归算法的理解与实现** 4. **Java编程语言基础:数组、循环、条件语句的应用** #### ...

    棋盘覆盖问题的源代码

    ### 棋盘覆盖问题详解 #### 一、问题背景 棋盘覆盖问题是计算机科学中的一个经典问题,它涉及到如何利用特定形状的骨牌(通常为L形)来覆盖一个带有缺失方格的棋盘。在本例中,棋盘大小为64×64,但实际应用中可以...

    算法与算法设计 棋盘覆盖问题

    【棋盘覆盖问题】是计算机科学中的一种经典算法问题,主要涉及到递归和分治策略。在本实验中,目标是使用L型骨牌(也称为“ tromino”)覆盖一个2的幂次乘以2的幂次大小的棋盘,除了一个特殊的方格之外。L型骨牌由三...

    棋盘覆盖问题_可视化

    棋盘覆盖问题是一种经典的组合优化问题,它在计算机科学,特别是算法设计和分析领域具有重要意义。这个问题涉及到如何用最少数量的不可重叠的棋子(通常为皇后或马)覆盖一个给定大小的棋盘,使得棋盘上的每一个格子...

    棋盘覆盖问题c代码

    棋盘覆盖问题是一个经典的组合优化问题,它源于数学和计算机科学领域。在本问题中,我们面临一个2^k × 2^k的棋盘,其中有一个特殊的方格被排除在外,目标是用L型骨牌来覆盖剩余的所有方格。L型骨牌是由三个相连的...

    棋盘覆盖问题C++

    棋盘覆盖问题C++程序,运行成功,棋盘大小自己输入的

    分治法案例-残缺棋盘覆盖问题-JAVA实现

    使用JAVA解决残缺棋盘覆盖问题:一个n*n的棋盘上有一个缺陷点,该点不能被覆盖,剩下的格子全部用三盒板覆盖。应用的是分治法。

    C#棋盘覆盖问题

    C# vs2010 实现棋盘覆盖问题,有源代码,和讲义。

    Java基于分治算法实现的棋盘覆盖问题示例

    本文主要介绍了Java基于分治算法实现的棋盘覆盖问题,简单描述了棋盘覆盖问题,并结合具体实例形式分析了Java基于分治算法实现棋盘覆盖问题的相关操作技巧。 知识点一:分治算法的基本概念 分治算法是一种将复杂...

    棋盘覆盖问题(C++版)

    棋盘覆盖问题是一种经典的组合优化问题,源自于数学和计算机科学。在八皇后问题的基础上,它探讨了如何有效地放置一定数量的棋子(通常为皇后)在棋盘上,使得任何两个棋子都不会在同一行、同一列或同一斜线上。这个...

    C语言编写的棋盘覆盖问题

    在一个2k*2k个方格组成的棋盘中,若恰有一个方格与其他方格不同,则称该方格位一...在棋盘覆盖问题中,要用4种不同形态的L型骨牌覆盖一个给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。

Global site tag (gtag.js) - Google Analytics