1. 程式人生 > 其它 >殘缺棋盤遊戲

殘缺棋盤遊戲

分支演算法

題意描述:

在2^k * 2^k的正方形棋盤上有一個缺口,這裡可以認為是已經被填充了,要求給出使用三角板去填滿這個棋盤的方案

#include <iostream>
 
using namespace std;
 
int amount,Board[100][100];
 
void Cover(int tr,int tc,int dr,int dc,int size)
{
    int s,t;
    if(size<2)
        return ;
    amount++;
    t=amount;
    s=size/2;
    if(dr<tr+s&&dc<tc+s)//殘缺在左上角
    {
        //覆蓋中間位置
        Board[tr+s-1][tc+s]=t;
        Board[tr+s][tc+s-1]=t;
        Board[tr+s][tc+s]=t;
 
        Cover(tr,tc,dr,dc,s);//覆蓋左上
        Cover(tr,tc+s,tr+s-1,tc+s,s);//覆蓋右上
        Cover(tr+s,tc,tr+s,tc+s-1,s);//覆蓋左下
        Cover(tr+s,tc+s,tr+s,tc+s,s);//覆蓋右下
    }
    else if(dr<tr+s&&dc>=tc+s)//殘缺在右上角
    {
        Board[tr+s-1][tc+s-1]=t;
        Board[tr+s][tc+s-1]=t;
        Board[tr+s][tc+s]=t;
 
        Cover(tr,tc,tr+s-1,tc+s-1,s);
        Cover(tr,tc+s,dr,dc,s);
        Cover(tr+s,tc,tr+s,tc+s-1,s);
        Cover(tr+s,tc+s,tr+s,tc+s,s);
    }
    else if(dr>=tr+s&&dc<tc+s)//殘缺在左下
    {
        Board[tr+s-1][tc+s-1]=t;
        Board[tr+s-1][tc+s]=t;
        Board[tr+s][tc+s]=t;
 
        Cover(tr,tc,tr+s-1,tc+s-1,s);
        Cover(tr,tc+s,tr+s-1,tc+s,s);
        Cover(tr+s,tc,dr,dc,s);
        Cover(tr+s,tc+s,tr+s,tc+s,s);
    }
    else
    {
        Board[tr+s-1][tc+s-1]=t;
        Board[tr+s-1][tc+s]=t;
        Board[tr+s][tc+s-1]=t;
 
        Cover(tr,tc,tr+s-1,tc+s-1,s);
        Cover(tr,tc+s,tr+s-1,tc+s,s);
        Cover(tr+s,tc,tr+s,tc+s-1,s);
        Cover(tr+s,tc+s,dr,dc,s);
    }
}
 
void Print(int s)
{
    for(int i=1;i<=s;i++)
    {
        for(int j=1;j<=s;j++)
            printf("%5d ",Board[i][j]);
        printf("\n");
    }
}
 
int main()
{
    int s=1,k,x,y;
    printf("輸入2殘缺棋盤的規模:2^k,k=");
    scanf("%d",&k);
    for(int i=1;i<=k;i++)
        s*=2;
    printf("輸入棋盤殘缺位置(x,y):");
    scanf("%d%d",&x,&y);
    Board[x][y]=0;
    Cover(1,1,x,y,s);
    Print(s);
    return 0;
}