棋盘覆盖

来源:互联网 发布:面向切面编程aop例子 编辑:程序博客网 时间:2024/05/17 06:03

一、算法实现题:

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

 

2、编程任务:

试设计一个算法,在用户界面,对给定的棋盘的大小,特殊方格的在棋盘中的位置,然后按执行按钮,就可以显示棋盘覆盖的结果。

 

3、数据输入:在用户界面中,棋盘的大小文本框中输入棋盘的大小(要2n次方大小)。在特殊方格行号文本框中输入特殊方格的行号,在特殊方格列号文本框中输入特殊方格的列号。

 

4、结果输出: cmd中显示字符图形,可以看到棋盘覆盖的结果。

           

2k-1×2k-1

2k-1×2k-1

2k-1×2k-1

 

2k-1×2k-1

 

 

 

二、解题思路

            用分治策略,易知,在任何一个2k×2k个的棋盘中,用到L型骨牌数恰好为(4k-1/3

            k>0时,将2k×2k棋盘分割为42k-1×2k-1子棋盘,从而特殊方格必位于 4个较小的子棋盘之一中,其余3个子棋盘中五特殊方格。此时,我们可以用一个L型的骨牌覆盖这3个较小的棋盘的会和处,这3个子棋盘上被L型骨牌覆盖的方格就成为改棋盘上的特殊方格,从而将原问题转化为4个较小的子问题。递归使用这种分割,直至棋盘简化为1×1的棋盘。

2k-1×2k-1

2k-1×2k-1

2k-1×2k-1

 

2k-1×2k-1

 

 

三、算法描述 

#include "iostream.h"

#include "iomanip.h"

#define Boardsize 16  //默认矩阵行列

int Board[Boardsize][Boardsize];

void ChessBoard(int tr,int tc,int dr,int dc,int size)

{

       if(size==1) return;

       static int tile=1;

       int t=tile++,//l型骨牌

        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,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,tr+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 i, j;

    int l,r;//特殊方块 

       cout<<"请输入特殊方块所在行、列"<<"(lr<="<<Boardsize-1<<"):";

       cin>>l>>r;

    ChessBoard(0,0, l, r, Boardsize);

    for(i = 0; i <Boardsize; i++)

    {

        for(j = 0; j < Boardsize; j++)

        {

                      cout<<setw(4)<<Board[i][j];

        }

       cout<<endl;

    }

}

原创粉丝点击