算法设计与分析——递归分治策略实现棋盘覆盖

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

#include<stdio.h>
#define sz 2   //sz宏定义棋盘的边长,sz必须为2的k次方 
void ChessBoard(int tr,int tc,int dr,int dc,int size);
void pt(int k);

int tile=0; //全局变量___填充的骨牌 
int Board[sz][sz]={0};//全局变量___棋盘 

int main()
{
    printf("棋盘大小为:%d\n",sz*sz);
    printf("\n");
    printf("初始棋盘为:\n");
	pt(sz);
	printf("\n");
	//printf("输入棋盘行数\n");
	//scanf("%d",&size);
	int dr,dc;
	printf("输入特殊棋子位置(用空格隔断)\n");
	scanf("%d %d",&dr,&dc);
	printf("\n");
	printf("标记后为\n"); 
	Board[dr][dc] =-1;
	pt(sz);
    ChessBoard(0,0,dr,dc,sz);
    printf("填满后为\n");
    pt(sz);
    printf("\n");
    printf("JHUN AI WSX"); 

}

/****************************************************************/
/*                                  				            */
/*                     棋盘递归分治函数	    					*/
/*				          参数说明 								*/
/*			          tr:棋盘左上角方格行号,初始值为0			*/
/*			          tc:棋盘左上角方格列号,初始值为0			*/
/*                    dr:特殊棋子的行号 						    */
/*		              dc:特殊棋子的列号 						    */
/*		  size:棋盘的边长,边长为2的k次方,棋盘的大小为4的k次方    */
/*                                            					*/
/***************************************************************/
void ChessBoard(int tr,int tc,int dr,int dc,int size)//
{
    if(size==1)			//当棋盘边长为1时,只有一个棋子 
        return;			
    int t=tile++; 		//L型骨牌 
	int s=size/2;		//size为棋盘边长,棋盘为正方形,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);

    }

}

/**********************************************/
/*                                            */
/*        双循环打印出棋盘的样子			      */
/*		参数说明:k为棋盘的边长(通SZ)         */ 
/*                                            */
/**********************************************/

void pt(int k)
{
    int i,j;
	for(i=0;i<k;i++)
    {
	
    for(j=0;j<k;j++)
    {
    printf("%4d",Board[i][j]);
	}
	printf("\n");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值