您的位置:首页 > 其它

棋盘覆盖问题

2012-09-18 22:20 197 查看
棋盘覆盖问题,讲的是在一个2的次方乘以2的次方的一个矩阵中有一个特殊的元素所占据的特殊位置,你如何在除去这个特殊位置上用一个L型(由三个方格组成,判断的时候,仍然要一个个的判断)填满整个棋盘,L其思想是将棋盘分成四个小棋盘,先在正中间判断特殊位置的凹向(其实也就是经过TR,TC,DR,DC的大小来判断),也就是经过这三个中间位置满足TR+S--《》的关系来确定,最后,每一次递归,将在每一个小棋盘中填三个棋格,看起来像L型,并将矩阵的中的相应元素置为相同的元素

#include<iostream>

using namespace std;

static int tile=1;

const int Bsize=4;

int board[Bsize][Bsize];

void chessBoard(int tr, int tc, int dr, int dc, int size);//对棋盘覆盖函数进行前视定义

void main()

{int tr=0,tc=0;//进入覆盖函数时的左上角,行号,和列号

const int dr=3,dc=3;//假设特殊方格在

board[dr][dc]=NULL;

chessBoard(tr,tc,dr,dc,Bsize);

for(int i=0;i<=Bsize-1;i++)

for (int j=0;j<=Bsize-1;j++)

{cout<<board[i][j]<<" ";

if(j==Bsize-1)

cout<<endl;}

}

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

{

if (size == 1) return;

int t = tile++, // L型骨牌号

s = size/2; // 分割棋盘

// 覆盖左上角子棋盘

if (dr < tr + s && dc < tc + s)

// 特殊方格在此棋盘中

chessBoard(tr, tc, dr, dc, s);

else {// 此棋盘中无特殊方格

// 用 t 号L型骨牌覆盖右下角

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 {// 此棋盘中无特殊方格

// 用 t 号L型骨牌覆盖左下角

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 {// 用 t 号L型骨牌覆盖右上角

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 {// 用 t 号L型骨牌覆盖左上角

board[tr + s][tc + s] = t;

// 覆盖其余方格

chessBoard(tr+s, tc+s, tr+s, tc+s, s);}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: