`
Riddick
  • 浏览: 640349 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

棋盘覆盖算法

阅读更多

 

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

    这里我们用分治法解决该问题。分治法是把一个规模很大的问题分解为多个规模较小、类似的子问题,然后递归地解决所有子问题,最后再由子问题的解决得到原问题的解决。
【解题思路】:将2^k x 2^k的棋盘,先分成相等的四块子棋盘,其中特殊方格位于四个中的一个,构造剩下没特殊方格三个子棋盘,将他们中的也假一个方格设为特殊方格。如果是:

左上的子棋盘(若不存在特殊方格)----则将该子棋盘右下角的那个方格假设为特殊方格
右上的子棋盘(若不存在特殊方格)----则将该子棋盘左下角的那个方格假设为特殊方格
左下的子棋盘(若不存在特殊方格)----则将该子棋盘右上角的那个方格假设为特殊方格
右下的子棋盘(若不存在特殊方格)----则将该子棋盘左上角的那个方格假设为特殊方格

 

当然上面四种,只可能且必定只有三个成立,那三个假设的特殊方格刚好构成一个L型骨架,我们可以给它们作上相同的标记。这样四个子棋盘就分别都和原来的大棋盘类似,我们就可以用递归算法解决。

代码如下:

#include<iostream.h>   
  
int tile=1;                   //L型骨牌的编号(递增)
  
int board[100][100];  //棋盘 

/*****************************************************
* 递归方式实现棋盘覆盖算法
* 输入参数:
* tr--当前棋盘左上角的行号
* tc--当前棋盘左上角的列号
* dr--当前特殊方格所在的行号
* dc--当前特殊方格所在的列号
* size:当前棋盘的:2^k
*****************************************************/
void chessBoard(int tr, int tc, int dr, int dc, int size)   
  
{   
  
       if(size==1)       //棋盘方格大小为1,说明递归到最里层
  
              return;   
  
       int t=tile++;     //每次递增1
  
       int s=size/2;    //棋盘中间的行、列号(相等的)
  
       //检查特殊方块是否在左上角子棋盘中
       if(dr<tr+s && dc<tc+s)                 //在
  
              chessBoard(tr, tc, dr, dc, s);   
  
       else         //不在,将该子棋盘右下角的方块视为特殊方块
  
       {   
  
              board[tr+s-1][tc+s-1]=t;   
  
              chessBoard(tr, tc, tr+s-1, tc+s-1, s);   
  
       }   
  
       //检查特殊方块是否在右上角子棋盘中
       if(dr<tr+s && dc>=tc+s)                  //在
  
              chessBoard(tr, tc+s, dr, dc, s);   
  
       else          //不在,将该子棋盘左下角的方块视为特殊方块
  
       {   
  
              board[tr+s-1][tc+s]=t;   
  
              chessBoard(tr, tc+s, tr+s-1, tc+s, s);   
  
       }   
  
       //检查特殊方块是否在左下角子棋盘中
       if(dr>=tr+s && dc<tc+s)                 //在
  
              chessBoard(tr+s, tc, dr, dc, s);   
  
       else            //不在,将该子棋盘右上角的方块视为特殊方块
  
       {   
  
              board[tr+s][tc+s-1]=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;   
  
              chessBoard(tr+s, tc+s, tr+s, tc+s, s);   
  
       }   
  
}   
  
    
  
void main()   
  
{   
  
       int size;   
  
       cout<<"输入棋盘的size(大小必须是2的n次幂): ";   
  
       cin>>size;   
  
       int index_x,index_y;   
  
       cout<<"输入特殊方格位置的坐标: ";   
  
       cin>>index_x>>index_y;   
  
       chessBoard(0,0,index_x,index_y,size);   
  
       for(int i=0;i<size;i++)   
  
       {   
  
              for(int j=0;j<size;j++)   
  
                     cout<<board[i][j]<<"\t";   
  
              cout<<endl;    
  
       }    
  
}  
   
分享到:
评论

相关推荐

    棋盘覆盖算法实现

    棋盘覆盖算法是一种经典的计算机科学问题,主要涉及图论、组合优化和算法设计。它源自一个实际的棋盘游戏,但被广泛应用于数据结构优化、网络设计和编码等多个领域。在本例中,我们讨论的是C++实现的棋盘覆盖算法。 ...

    棋盘覆盖算法演示程序

    棋盘覆盖算法是一种经典的计算机科学问题,它源于数学和图论,被广泛应用于解决资源分配、网络优化等问题。在这个“棋盘覆盖算法演示程序”中,我们可以通过代码和实例来深入理解这一算法。 棋盘覆盖问题通常以一个...

    C++Builder6.0编写的可视化棋盘覆盖算法

    《C++Builder6.0实现的可视化棋盘覆盖算法详解》 在计算机科学领域,棋盘覆盖问题是一个经典的组合优化问题,它涉及到图论、算法设计以及计算机图形学等多个方面。本篇将深入探讨如何利用C++Builder6.0这一强大的...

    C++编写的棋盘覆盖算法

    这是由本人编写的棋盘覆盖算法,希望对各位有用,让各位能够了解其中的原理

    棋盘覆盖算法动态演示V4.02

    《棋盘覆盖算法动态演示V4.02》是一款基于Microsoft Visual Studio 2008开发的软件,它专注于展示棋盘覆盖算法的图形化过程。这个程序利用了MFC(Microsoft Foundation Classes)库,结合了定时器技术、STL...

    棋盘覆盖算法--c代码

    棋盘覆盖算法 用c代码写的,供大家分享一下。。。。。。。。。。。。。

    棋盘覆盖算法 演示 双缓冲绘图 定时器 VC++ 6.0 代码

    语言C++,编译器VC++ 6.0 系统windows 知识涵盖MemoDC双缓冲绘图、Timer、控件关联变量、OnPaint的触发 STL中的vector使用,棋盘覆盖算法, 画笔等基础的MFC绘图

    棋盘覆盖_skinj9g_棋盘覆盖_棋盘覆盖算法_

    "棋盘覆盖算法"是为了找到一个有效的解决方案而设计的计算策略。这种算法通常采用贪心或回溯等方法来寻找最优或近似最优的覆盖方案。贪心算法会在每一步选择当前看起来最好的决策,而不考虑长远影响;回溯算法则会...

    棋盘覆盖算法(分治算法)

    ### 棋盘覆盖算法(分治算法) #### 背景与定义 在计算机科学领域,特别是算法设计中,“棋盘覆盖”问题是一个经典的题目,它涉及到如何使用特定形状的多米诺骨牌(通常为 L 形)来覆盖一个有缺陷的棋盘。这里所谓的...

    棋盘覆盖算法.zip

    棋盘覆盖算法是一种经典的组合优化问题,它源于数学和计算机科学领域。在棋盘覆盖问题中,目标是用最少数量的非重叠子集来覆盖一个给定的棋盘的所有单元格。这个问题有许多实际应用,比如网络路由、资源分配和编码...

    棋盘覆盖算法python

    实现有面板,可输入边值然后根据边值生成棋盘。

    棋盘覆盖算法(C语言)

    棋盘覆盖算法是一种经典的计算机科学问题,主要涉及图论、组合优化和算法设计。在本例中,我们关注的是一个使用C语言实现的版本。这个算法的目的是找到一种方法来覆盖一个棋盘(通常指的是8x8的国际象棋棋盘)的一...

    棋盘覆盖算法实现.doc

    ### 棋盘覆盖算法详解 #### 一、引言 在计算机科学中,棋盘覆盖问题是一个典型的递归问题,通常用来展示递归方法在解决复杂问题时的强大能力。该问题描述为:在一个\(2^k \times 2^k\)大小的棋盘中,除去一个特殊...

    棋盘覆盖_skinj9g_棋盘覆盖_棋盘覆盖算法_源码.zip

    在这个特定的案例中,"skinj9g"可能是一个程序员或团队的标识,而"棋盘覆盖算法"指的是解决这个问题的特定方法。 棋盘覆盖算法通常用于解决资源分配、网络设计、任务调度等实际问题。它具有重要的理论价值和应用...

    棋盘覆盖算法代码

    ### 棋盘覆盖算法详解及Java实现 #### 一、背景介绍 棋盘覆盖问题是一种经典的计算机科学问题,涉及到递归与分治思想的应用。本篇将详细解析棋盘覆盖算法的核心概念,并通过Java语言具体实现算法逻辑。 #### 二、...

    C#实现实现的棋盘覆盖算法源码(有bug)

    本主题涉及的是使用C#编程语言实现的棋盘覆盖算法,结合GUI(图形用户界面)展示。让我们深入探讨这个算法及其在C#中的实现。 棋盘覆盖问题通常指的是如何用最少数量的非重叠多边形或形状来完全覆盖一个给定的棋盘...

    算法分析中棋盘覆盖算法

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

    棋盘覆盖算法(c++)

    ### 棋盘覆盖算法(C++) #### 算法背景 棋盘覆盖问题是一个经典的计算机科学问题,它涉及到如何用特定形状的瓷砖来覆盖一个有缺陷的棋盘。通常情况下,这个问题是在一个\(n \times n\)的棋盘上进行的,其中\(n = ...

Global site tag (gtag.js) - Google Analytics