棋盘覆盖问题

问题描述:

在一个2k×2k个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。
易知,覆盖任意一个2k×2k的特殊棋盘,用到的骨牌数恰好为(4K-1)/3。

输入格式

第一行为k(棋盘的尺寸),第二行为x,y(1<=x,y<=2^k),分别表示特殊方格所在行与列。

输出格式

共2^k行,分别表示覆盖该格的L型的编号(特殊格用0表示)。

输出要求:最小字符宽度为4,左对齐输出

 

#include<stdio.h>
#include<math.h> 
//#include <bits/stdc++.h>
//using namespace std;
const int N=500;
int board[N][N]={0};
int cnt=1;//记录骨牌序号 
void ChessBoard(int tr,int tc,int dr,int dc,int size){
	//tr,tc为棋盘最左上角的坐标
	//dr,dc为特殊方格的坐标
	//size为棋盘阶数(2^size)
	if(size==1){
		return;
		//递归出口 
	}else{//进入递归 化为4个size-1阶的问题;
		int t=cnt++; 
		int 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-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);
		}
		 
	} 
}
int main(){
	int k,x,y;
//	printf("请输入棋盘的规模K:");
	scanf("%d",&k);
//    printf("请输入特殊方格的下标x,y:");
	//注意:输入的是下标,下标从0开始 
	scanf("%d %d",&x,&y);
	ChessBoard(0,0,x,y,pow(2,k));
//	棋盘最左上角坐标位(0,0) 
	for(int i=0; i<pow(2,k); i++){
		for (int j=0; j<pow(2,k); j++){   
            if(j==pow(2,k)-1)
            	printf("%d",board[i][j]);
            else
				printf("%-4d",board[i][j]);
		}
		printf("\n");
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
棋盘覆盖问题在一个2^n * 2^n的棋盘上,恰好有一个方格与其他方格不同,现在要用L型骨牌覆盖整个棋盘,求解覆盖方案。这个问题可以通过递归的方式解决,具体方法如下: 1.将棋盘分成4个子棋盘,其中只有一个子棋盘包含特殊方格。 2.用一个L型骨牌覆盖另外3个子棋盘的会合处,将这3个子棋盘转化为特殊棋盘,然后递归地解决这4个子棋盘。 3.当棋盘被分割成1*1的子棋盘时,递归结束。 下面是Python代码实现: ```python def chessboard_cover(board, tr, tc, dr, dc, size, label): global tile if size == 1: return t = tile tile += 1 s = size // 2 # 左上角子棋盘 if dr < tr + s and dc < tc + s: chessboard_cover(board, tr, tc, dr, dc, s, label) else: board[tr + s - 1][tc + s - 1] = t chessboard_cover(board, tr, tc, tr + s - 1, tc + s - 1, s, label) # 右上角子棋盘 if dr < tr + s and dc >= tc + s: chessboard_cover(board, tr, tc + s, dr, dc, s, label) else: board[tr + s - 1][tc + s] = t chessboard_cover(board, tr, tc + s, tr + s - 1, tc + s, s, label) # 左下角子棋盘 if dr >= tr + s and dc < tc + s: chessboard_cover(board, tr + s, tc, dr, dc, s, label) else: board[tr + s][tc + s - 1] = t chessboard_cover(board, tr + s, tc, tr + s, tc + s - 1, s, label) # 右下角子棋盘 if dr >= tr + s and dc >= tc + s: chessboard_cover(board, tr + s, tc + s, dr, dc, s, label) else: board[tr + s][tc + s] = t chessboard_cover(board, tr + s, tc + s, tr + s, tc + s, s, label) def print_board(board): for row in board: print(' '.join(str(x).rjust(2) for x in row)) # 测试代码 size = 8 board = [[0] * size for _ in range(size)] tile = 1 label = 1 chessboard_cover(board, 0, 0, 0, 1, size, label) print_board(board) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

平平无奇的CV

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值