递归分治解决棋盘覆盖问题

package algorithm;
//递归分治解决棋盘覆盖问题
public class ChessBoard {

	//tr棋盘左上角方格的行号
	//tc棋盘左上角方格的列号
	//size = 2^k棋盘规格为2^k *2^k
	//dr特殊方格所在的行号
	//dc特殊方格所在的列号
	private static int tile = 0;//L型骨牌号
	public  static int[][] Board = new int[100][100];
	public static void chessBoard(int tr,int tc,int dr,int dc,int size){
		if(size == 1)
			return;
		size/=2;
		int t = ++tile;
		//特殊方格在左上角
		if(dr < tr + size&&dc < tc + size){
			chessBoard(tr,tc,dr,dc,size);
		}else{
			Board[tr + size - 1][tc + size -1] = t;
			chessBoard(tr,tc,tr + size -1,tc + size -1,size);
		}
		//特殊方格在右上角
		if(dr < tr + size&&dc >= tc + size){
			chessBoard(tr ,tc + size,dr,dc,size);
		}else{
			Board[tr + size - 1][tc + size] = t;
			chessBoard(tr,tc + size,tr + size - 1,tc + size,size);
		}
		//特殊方格在左下角
		if(dr >= tr + size&&dc < tc + size){
			chessBoard(tr + size,tc,dr,dc,size);
		}else{
			Board[tr + size][tc + size -1] = t;
			chessBoard(tr + size,tc,tr + size,tc + size -1,size);
		}
		//特殊方格在右下角
		if(dr >= tr + size&&dc >= tc + size){
			chessBoard(tr + size,tc + size,dr,dc,size);
		}else{
			Board[tr + size][tc + size] = t;
			chessBoard(tr + size,tc + size,tr + size,tc + size,size);
		}

	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int size = 8;
		chessBoard(0,0,3,3,size);
		for(int i = 0;i < size;i++){
			for(int j = 0;j < size;j++){
				String s  = String.format("%3d",Board[i][j]);
				System.out.print(s);
			}
			System.out.println();
		}

	}

}

时间: 2024-10-04 07:09:47

递归分治解决棋盘覆盖问题的相关文章

分治算法----棋盘覆盖问题

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

利用分治法解决棋盘覆盖问题

1.问题描述:点击打开链接 2.代码: #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<algorithm> #include<cassert> #include<string> #include<sstream> #include<set> #include<vector> #include<stack> #include<map&

经典分治之棋盘覆盖问题

刘汝佳书上的经典题,不过目前所见过的变式并不多 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<string> 5 #include<cstdio> 6 using namespace std; 7 const int maxn=1500; 8 int n; 9 int x,y; 10 int cnt=0; 11 int a[maxn][maxn]

棋盘覆盖问题(递归分治)

       问题描述: 在一个2^k×2^k个方格组成的棋盘中,若有一个方格与其他方格不同,则称该方格为一特殊方格,且称该棋盘为一个特殊棋盘.显然特殊方格在棋盘上出现的位置有4^k种情形.因而对任何k≥0,有4^k种不同的特殊棋盘.     下图–图(1)中的特殊棋盘是当k=3时16个特殊棋盘中的一个: 图(1) 题目要求在棋盘覆盖问题中,要用下图-图(2)所示的4种不同形态的L型骨牌覆盖一个给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖. 图(2) 题目包含多组测试

算法复习_分治算法之二分搜索、棋盘覆盖、快速排序

一.基本概念 分治法,顾名思义,即分而治之的算法,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题…… 二.基本思想及策略 设计思想:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之. 策略:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解.这种算法设计策略叫做分治法. 三

棋盘覆盖问题 (粉书 P230 【递归】** )

转载自:http://blog.csdn.net/akof1314/article/details/5423608  (赞) 在一个 2^k * 2^k 个方格组成的棋盘中,若恰有一个方格与其它方格不同,则称该方格为一特殊方格,称该棋盘为一特殊棋盘.显然特殊方格在棋盘上出现的位置有 4^k 种情形.因而对任何 k>=0 ,有 4^k 种不同的特殊棋盘.下图所示的特殊棋盘为 k=2 时 16 个特殊棋盘中的一个. 在棋盘覆盖问题中,要用下图中 4 中不同形态的 L 型骨牌覆盖一个给定的特殊棋牌上除

用分治策略实现棋盘覆盖问题

C++程序源代码如下: // 棋盘覆盖.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include<fstream> using namespace std; int tile=1; //L型骨牌的编号(递增) int board[100][100]; //棋盘 /***************************************************** * 递归

棋盘覆盖问题

棋盘覆盖问题       问题描述: 在一个2^k×2^k个方格组成的棋盘中,若有一个方格与其他方格不同,则称该方格为一特殊方格,且称该棋盘为一个特殊棋盘.显然特殊方格在棋盘上出现的位置有4^k种情形.因而对任何k≥0,有4^k种不同的特殊棋盘.     下图–图(1)中的特殊棋盘是当k=3时16个特殊棋盘中的一个: 图(1) 题目要求在棋盘覆盖问题中,要用下图-图(2)所示的4种不同形态的L型骨牌覆盖一个给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖. 图(2) 题目

棋盘覆盖问题&amp;循环赛日程表问题

---恢复内容开始--- 简单的分治,曾经看了好久想了好久也不会的随着时间变成最简单的题,由于刘汝佳书上说的不多,网上找到的又总是一个湖南OJ上的题(看都不愿意看)所以我还是仅说一下思想吧. 棋盘覆盖问题: 我觉得核心问题是在找不到特殊方格是假设了3个方格做特殊方格使分治继续. 循环赛日程表相对就脑残多了,关键是找到规律,然后分治问题到只有2*2的表格,(已经打好了),然后一点点按照规律打印其他小单位. 由于这题找到了原题,(并且很简单)我就把自己代码复制一下,棋盘覆盖问题是在网上找的,可以用来