今天小编没怎么学习,就当放松了吧,明天一定要抓紧时间补回来~

但是不会少了小伙伴们的算法的。

海风的幻想纯音乐

声明:因为两天同时写同一个算法会显示跟我这两天写的文章重复会不通过,

还要申请、审核好麻烦的,所以今天给小伙伴们分享一下分治算法的棋盘问题吧。

分治算法(官方解释):

当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出。对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个问题的解法。如果这些子问题还较大,难以解决,可以再把它们分成几个更小的子问题,以此类推,直至可以直接求出解为止。这就是分治策略的基本思想。

分治算法(自我理解)

其实就是讲很大的计算数据一步步分解到最小,过程中当然少不了我们之前学到的递归算法,还借鉴到二分法的算法思想,通过递归,将一个大问题分解成两个小问题,再将两个小问题分解成四个更小的问题,直到分解到很简单就能解决的问题,进而依次返回,求出最原始的大问题的解。

棋盘问题:

在一个2^k×2^k (k≥0)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为特殊方格。显然,特殊方格在棋盘中可能出现的位置有4^k种,因而有4^k种不同的棋盘,图4.10(a)所示是k=2时16种棋盘中的一个。棋盘覆盖问题(chess cover problem)要求用图4.10(b)所示的4种不同形状的L型骨牌覆盖给定棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。

思路:

这个题的思路直到想到这一点我们就很快能编程出来,但是如果想不到,就很难了~

我们把2^k×2^k的方格逐渐分解,(以8*8为例)讲解一下,初始棋盘是8*8的,我们将长和宽都一分为2,这样就将棋盘分割成四个部分了,也就是每个都是4*4的棋盘,之后再将每个4*4的棋盘分解成4个2*2的棋盘,再将2*2的棋盘分解成4个1*1的方格了,然后逐步返回,当然,题目中说到有一个特殊的方格,这就需要写一个递归函数去寻找这个特殊方格,既然每个递归的过程都把原来的棋盘分解成4个小棋盘,那么就分别对左上、左下、右上、右下的棋盘进行判断是否有特殊方格,如果有,就将该部分继续递归分解,直到找到这个特殊方格的位置。

如果特殊方格没在这个范围内,就将这个范围靠近员棋盘中心的那个方格设定为特殊方格(见图b),这样也就有了特殊方格,我们也知道他的位置,就可以通过递归进行调用它,知道分解到最小单位的棋盘。

源代码:

package 分治算法;public class 棋盘覆盖 { public static int tile = 1;//表示L形骨牌的编号 public int [][]board=new int[4][4];//表示4*4的棋盘 //处理带有特殊棋子的棋盘,tr、tc表示棋盘的入口即左上角的序列数,dr、dc代表特殊棋子的 //位置(序列号),size代表棋盘的行列数 public void chessboard(int tr,int tc,int dr,int dc,int size){ if(size==1)return; int t=tile++; System.out.println(t); int s = size/2;//每次划大棋盘为一半的子棋盘 //要处理带有特殊旗子的棋盘,需要先处理左上角的棋盘 if(dr chessboard(tr,tc,dr,dc,s);//处理有特殊棋子的左上角棋盘 }else{ //处理无特殊棋子的左上角子棋盘 board[tr+s-1][tc+s-1] = t; //设左上角棋盘的右下角为特殊棋子用t形的骨牌覆盖 //由于骨牌骨牌有三种,当处理过程中同一级设置的特殊棋子用相同的骨牌覆盖 chessboard(tr,tc,tr+s-1,tc+s-1,s); } //第二步处理右上角棋盘 if(dr

=tc+s){//右上角棋盘有特殊棋子

+s&&dc>

chessboard(tr,tc+s,dr,dc,s);//处理有特殊棋子的右上角棋盘

}

else{ //处理无特殊棋子的右上角棋盘

board[tr+s-1][tr+s]=t;//设右上角棋盘的左下角为特殊棋子,用t形的骨牌覆盖

//由于骨牌有三种,当处理过程中同一级设置的特殊棋子用相同的骨牌覆盖

chessboard(tr,tc+s,tr+s-1,tc+s,s);

}

//第三种处理左下角的棋盘

if(dr>=tr+s&&dc

chessboard(tr+s,tc,dr,dc,s);//处理有特殊棋子的左下角子棋盘

}

else{//处理没有左下角的子棋盘

board[tr+s][tc+s-1]=t;//设左下角的右上角为特殊棋子,用t形的骨牌覆盖

//由于骨牌有三种,当处理过程中同一级设置的特殊棋子用相同的骨牌覆盖

chessboard(tr+s,tc,tr+s,tc+s-1,s);

}

//第四种处理右下角的棋盘

if(dr>=tr+s&&dc>=tc+s){//右下角有特殊棋子

chessboard(tr+s,tc+s,dr,dc,s);

}

else{//处理没有特殊棋子的右下角

board[tr+s][tc+s] = t;//设右下角的左上角为特殊棋子,用t形的骨牌覆盖

//由于骨牌有三种,当处理过程中同一级设置的特殊棋子用相同的骨牌覆盖

chessboard(tr+s,tc+s,tr+s,tc+s,s);

}

}

public static void main(String[] args) {

棋盘覆盖 c=new 棋盘覆盖();

c.chessboard(0, 0, 1, 1, 4);

for(int i=0;i<4;i++){

for(int j=0;j<4;j++){

System.out.print(c.board[i][j]+" ");

}

System.out.println("");

}

}

}

结语:

希望各位小伙伴们对本题好好思考一下,在大神文档的帮助下小编当时也是思考和理解了很久再弄懂的~

爱编程的小萝卜头

从左上角到右下角 棋盘问题_分治算法之棋盘问题相关推荐

  1. 计算机基础算法棋盘覆盖,分治算法求解棋盘覆盖问题互动教学过程.doc

    分治算法求解棋盘覆盖问题互动教学过程 分治算法求解棋盘覆盖问题互动教学过程 摘要:针对算法设计与分析课程难度较大.对学生编程能力要求较高的现状,通过对棋盘覆盖问题的分治算法求解过程进行互动教学设计,引 ...

  2. java 比赛赛程_分治算法兵乓球比赛日程(java)

    分治算法之兵乓球比赛日程 分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同.求出子问题的解,就可得到原问题的解.也就是字面上的解释是" ...

  3. java根号n元素的合并排序算法_分治算法:根号n段合并排序算法

    问题: 将数组 a[0,n-1]划分为 根号n 个子数组,每个子数组有 O(根号n)个元素.然后递归地对分割后的子数组进行排序,最后将所得到的根号n 个排好序的子数组合并排序. 工具与语言 我选择的为 ...

  4. 分治算法求解棋盘覆盖问题

    1. 问题描述: 在一个2k×2k 个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘.在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上 ...

  5. lfu算法实现c语言_分治算法解决最大子段和问题。c语言实现

    #include<stdio.h> int MaxSubSum(int A[],int left,int right); void main() {int A[6]={-2,11,-4,1 ...

  6. c语言分治法求众数重数_分治算法:求众数及其重数

    问题描述: 给定含有 n 个元素的多重集合 S,每个元素在 S 中出现的次数称为该元素的重数.多重集合 S 中重数最大的素称为众数.例如多重集合 S={1,2,2,7,2,7,5},其中众数是 2,其 ...

  7. 常用十大算法_回溯算法

    回溯算法 回溯算法已经在前面详细的分析过了,详见猛击此处. 简单的讲: 回溯算法是一种局部暴力的枚举算法 循环中,若条件满足,进入递归,开启下一次流程,若条件不满足,就不进行递归,转而进行上一次流程. ...

  8. 分治法的关键特征_算法系列之常用算法之一----分治算法

    一.基本概念 在计算机科学中,分治法是一种很重要的算法.分治算法,字面上的解释是"分而治之",分治算法主要是三点: 1.将一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问 ...

  9. 棋盘覆盖问题--分治策略

    问题描述: 在一个2k×2k (k≥0,k为上标)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为特殊方格.棋盘覆盖问题要求用图(b)所示的4种不同形状的L型骨牌覆盖给定棋盘上除特殊方格以外 ...

最新文章

  1. 软件测试人员需要掌握的linux命令(一)
  2. sort (STL)
  3. 262K Color
  4. 图像条纹检测 python_【连载2.1】结构光三维检测引言面向强反射表面的多传感器三维检测技术研究...
  5. Raw Socket编程
  6. Go语言与数据库开发:01-09
  7. 单元测试——Winfrom
  8. JavaScript let、const与var的区别
  9. VBNET的一些特殊能力
  10. DSP之时钟与定时器之二通用定时器
  11. 编程基本功:再紧急的工作到了员工手里,都不急
  12. Windows10易升下载
  13. HTML5植物大战僵尸游戏源码下载
  14. DOS原理和常用命令详解示例
  15. 【权限维持】window服务端常见后门技术
  16. 摄影基础知识: 曝光补偿完全指南
  17. 笔趣看小说Python3爬虫抓取
  18. nginx单点故障怎么破?
  19. 嵌入式系统与硬件安全知识小记
  20. 800个有趣句子帮你记忆7000个单词(1-400)

热门文章

  1. 财富自由之路-读后感
  2. 电脑c盘不够用怎么扩容,磁盘c怎么扩展
  3. python之有理数运算Rational类
  4. 关于USART波特率、TIM的外设预分频值
  5. IT女纸3年换5家公司的真实写照
  6. 除了高通和博通,还有哪些Wi-Fi6路由器芯片方案可选
  7. 【论文阅读】基于区块链的无人集群作战信息共享架构_臧义华
  8. miui10.2.2 或以上的小米手机上照片旋转问题及解决
  9. python小数乘法计算_小学数学所有的知识点都在这里,期末复习必备!
  10. 解决Java连接达梦数据库报For input string: “8“的问题