标题:棋牌覆盖问题,探讨。
只看楼主
fourleaves
Rank: 2
等 级:论坛游民
帖 子:194
专家分:99
注 册:2010-5-8
结帖率:95.65%
已结贴  问题点数:20 回复次数:6 
棋牌覆盖问题,探讨。
我又来啦,终于解决了棋牌覆盖问题,来分享下,代码晚上或明天在贴。
棋牌覆盖问题:
题目如下:
给一个2^k*2^k的棋牌,即宽=pow(2,k),长=pow(2,k),在棋牌中有方格为黑色,其它都为白色,现在给
如下四种图形,要求用其覆盖这个棋牌,但是不许覆盖到黑方格,也不与许相互覆盖。这是递归的典型应用
不过细节上有点容易出错,所以要画图,可以一目了然。

我给画了出来。见附件。
[local]1[/local]

输出覆盖方式。

思路也很简单,就是递归处理,把2^k的规模,分成4个2^k-1的规模,递归到k == 0时候。
对于有含黑方格的哪一方正继续递归,关键是没有黑方格的方块怎么办,聪明的你可能会想到,把它其中一块视为黑方格
在仔细一想由于这三个2^k-1的方阵都相邻,所以我们可以用上面四种图形中的一块覆盖(这个取决与那个真正的黑方格在哪一方阵之中)。


也不知道还有什么更好的办法。懂得的不妨写写,一起探讨,探讨。
搜索更多相关主题的帖子: 棋牌 color 
2013-04-01 16:00
fourleaves
Rank: 2
等 级:论坛游民
帖 子:194
专家分:99
注 册:2010-5-8
得分:0 

再复杂的问题也基于最简单的原理。耐心,耐心!丰富自己!等待时机!
2013-04-01 16:01
fourleaves
Rank: 2
等 级:论坛游民
帖 子:194
专家分:99
注 册:2010-5-8
得分:0 

再复杂的问题也基于最简单的原理。耐心,耐心!丰富自己!等待时机!
2013-04-01 16:04
小xiong
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:388
专家分:1722
注 册:2013-2-8
得分:2 
顶。。。
2013-04-01 16:08
fourleaves
Rank: 2
等 级:论坛游民
帖 子:194
专家分:99
注 册:2010-5-8
得分:0 
程序代码:
#include <stdio.h>
const int maxn = 2 << 6;
int code_number = 1;
void chessBord(int curx,int cury,int bx,int by,int size);
void print_r(int size);
int map[maxn][maxn];
int main()
{
    chessBord(0,0,1,1,4);
    print_r(4);
    return 0;
}
void print_r(int size){
    for(int i = 0; i < size; i++){
        for(int j = 0; j < size; j++){
            printf("%3d ",map[i][j]);
        }
        printf("\n");
    }
    
}
void chessBord(int curx,int cury,int bx,int by,int size){//curx,cury为当前方阵左上方坐标,和size可谓一确定一个方阵,bx,by为黑方格所在位置
    if(size == 1){
        return;
    }
    int midx = curx + size / 2;
    int midy = cury + size / 2;
    int some_number = code_number++; //必须再定义一个变量,这是属于同一层的变量值。 
    if(bx < midx && by < midy){//在左上区域 
        chessBord(curx,cury,bx,by,size / 2);
    }else{//不再该区域,就补上同一个数字,然后继续分解并把补上的也视为黑块 
        map[midx - 1][midy - 1] = some_number;
        chessBord(curx,cury,midx - 1,midy -1,size / 2);
    }
    
    if(bx >= midx && by < midy){//在左下区域 
        chessBord(midx,cury,bx,by,size / 2);
    }else{
        map[midx][midy - 1] = some_number;
        chessBord(midx,cury,midx,midy - 1,size / 2);
    } 
    
    if(bx < midx && by >= midy){//在右上区域 
        chessBord(curx,midy,bx,by,size / 2);
    }else{
        map[midx - 1][midy] = some_number;
        chessBord(curx,midy,midx - 1,midy,size/2);
    }
    
    if(bx >= midx && by >= midy ){//在右下区域 
        chessBord(midx,midy,bx,by,size / 2);
    }else{
        map[midx][midy]= some_number;
        chessBord(midx,midy,midx,midy,size/2);
    }
    
}

再复杂的问题也基于最简单的原理。耐心,耐心!丰富自己!等待时机!
2013-04-01 23:32
fourleaves
Rank: 2
等 级:论坛游民
帖 子:194
专家分:99
注 册:2010-5-8
得分:0 
没几个人来写啊~~算了,准备结贴掉了~

再复杂的问题也基于最简单的原理。耐心,耐心!丰富自己!等待时机!
2013-04-01 23:33
rushac
Rank: 2
等 级:论坛游民
帖 子:2
专家分:24
注 册:2013-4-1
得分:18 
2013-04-01 23:38



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-402627-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.469212 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved