• 一、MyCoverBoardA.c
  • 二、 MyCoverBoardB.c
  • MyCoverBoardA.c-运行结果示例
  • 1.k为1
  •    1.1缺陷在1 0位置
  •    1.2缺陷在0 0位置
  • 2.k为2
  •    2.1缺陷在1 2位置
  •    2.2缺陷在2 3位置
  • 3.k为3
  •    3.1缺陷在5 6位置
  •    3.1缺陷在4 2位置
  • 4.k为4
  • 4.1   3.1缺陷在12 9位置
  • MyCoverBoardB.c-运行结果示例
  • 1.k为1
  •    1.2缺陷在0 0位置
  •    1.1缺陷在0 1位置
  •    1.1缺陷在1 0位置
  •    1.2缺陷在1 1位置
  • 2.k为2
  •    2.1缺陷在1 2位置
  •    2.2缺陷在2 3位置
  • 3.k为3
  •    3.1缺陷在5 6位置
  •    3.1缺陷在4 2位置
  • 4.k为4
  • 4.1   3.1缺陷在12 9位置



【TDTX】

【MyCoverBoardA.c】把棋盘的填充视为:【排除缺陷式】位置填充;
【MyCoverBoardB.c】把棋盘的填充视为:【图形卡位式】位置填充;
【总结】两者最终的结果完全相同,但视觉效果不同。

一、MyCoverBoardA.c

#include <stdio.h>
#include <stdlib.h>
int qa,qb;
int mpow(int n,int k)
{
	int i;
	int t = n;
	for(i = 1; i < k;i++)
	{
		t = t * n;
	}
	return t;
}
void generateBoard(int tr,int tc,int dr,int dc,int size,int** b,int* t1)
{
	int hs = size / 2;
	if(size == 2)
	{
		if( dr == tr && dc == tc )
		{
			//残缺位置在4格左上角 
			b[tr][tc+1] = *t1;
			b[tr+1][tc] = *t1;
			b[tr+1][tc+1] = *t1;
			(*t1)++; 
		}
		if( dr== tr && dc == tc + 1)
		{
			//残缺位置在4格右上角 
			b[tr][tc] = *t1;
			b[tr+1][tc] = *t1;
			b[tr+1][tc+1] = *t1;
			(*t1)++; 
		}
		if( dr == tr + 1 && dc == tc)
		{
			//残缺位置在4格左下角 
			b[tr][tc] = *t1;
			b[tr][tc+1] = *t1;
			b[tr+1][tc+1] = *t1;	
			(*t1)++; 
		}
		if( dr == tr + 1 && dc == tc +1)
		{
			//残缺位置在4格右下角 
			b[tr][tc] = *t1;
			b[tr][tc+1] = *t1;
			b[tr+1][tc] = *t1;
			(*t1)++; 	
		}
/*
		for(int i = 0;i < 2*size;i++)
		{
			for(int j = 0;j < 2*size;j++)
			{
				printf("%d\t",b[i][j]); 
			}
			puts("");
		}
*/
		//printf("\ntr:%d,tc:%d----------------------\n",tr,tc);
		b[qa][qb] = 0;
		return;
	}
	else
	{
		if(dr < tr + hs && dc < tc + hs)
		{
			int tdr,tdc;
			//残缺在第二象限
			b[tr+hs-1][tc+hs] = *t1;
			b[tr+hs][tc+hs-1] = *t1;
			b[tr+hs][tc+hs] = *t1;
			(*t1)++; 
			generateBoard(tr,tc,dr,dc,hs,b,t1);
			
			tdr = tr + hs - 1;
			tdc = tc + hs; 
			generateBoard(tr,tc+hs,tdr,tdc,hs,b,t1);
			
			tdr = tr + hs;
			tdc = tc + hs - 1; 
			generateBoard(tr+hs,tc,tdr,tdc,hs,b,t1);
			
			tdr = tr + hs;
			tdc = tc + hs; 
			generateBoard(tr+hs,tc+hs,tdr,tdc,hs,b,t1);
		}
		if(dr < tr + hs && dc >= tc + hs)
		{
			int tdr,tdc;
			//残缺在第一象限
			b[tr+hs-1][tc+hs-1] = *t1;
			b[tr+hs][tc+hs-1] = *t1;
			b[tr+hs][tc+hs] = *t1;
			(*t1)++; 
			generateBoard(tr,tc+hs,dr,dc,hs,b,t1);
			
			tdr = tr + hs - 1;
			tdc = tc + hs - 1; 
			generateBoard(tr,tc,tdr,tdc,hs,b,t1);
			
			tdr = tr + hs;
			tdc = tc + hs - 1; 
			generateBoard(tr+hs,tc,tdr,tdc,hs,b,t1);

			tdr = tr + hs;
			tdc = tc + hs; 
			generateBoard(tr+hs,tc+hs,tdr,tdc,hs,b,t1);
		}
		if(dr >= tr + hs && dc < tc + hs)
		{
			int tdr,tdc;
			//残缺在第三象限
			b[tr+hs-1][tc+hs-1] = *t1;
			b[tr+hs-1][tc+hs] = *t1;
			b[tr+hs][tc+hs] = *t1;
			(*t1)++; 
			generateBoard(tr+hs,tc,dr,dc,hs,b,t1);
			
			tdr = tr + hs - 1;
			tdc = tc + hs - 1; 
			generateBoard(tr,tc,tdr,tdc,hs,b,t1);

			tdr = tr + hs - 1;
			tdc = tc + hs; 
			generateBoard(tr,tc+hs,tdr,tdc,hs,b,t1);
			
			tdr = tr + hs;
			tdc = tc + hs; 
			generateBoard(tr+hs,tc+hs,tdr,tdc,hs,b,t1);
		}
		if(dr >= tr + hs && dc >= tc + hs)
		{
			int tdr,tdc;
			//残缺在第四象限
			b[tr+hs-1][tc+hs-1] = *t1;
			b[tr+hs-1][tc+hs] = *t1;
			b[tr+hs][tc+hs-1] = *t1;
			(*t1)++; 
			generateBoard(tr+hs,tc+hs,dr,dc,hs,b,t1);
			
			tdr = tr+hs-1;
			tdc = tc+hs-1;
			generateBoard(tr,tc,tdr,tdc,hs,b,t1);
			
			tdr = tr+hs-1;
			tdc = tc+hs;
			generateBoard(tr,tc+hs,tdr,tdc,hs,b,t1);
			
			tdr = tr+hs;
			tdc = tc+hs-1;
			generateBoard(tr+hs,tc,tdr,tdc,hs,b,t1);
		}
	} 
}
int main()
{
	//左下残缺 右下残缺 左上残缺 右上残缺
	//* *      * *        *      *
	//  *      *        * *      * *
	
	int k;
	printf("输入棋盘2^k×2^k的k值:");
	scanf("%d",&k);
	int size = mpow(2,k);
	//printf("size = %d\n",size);
	
	int *b[size]; //生成棋盘矩阵
	for(int i = 0;i < size;i++)
	{
		b[i] = (int*)malloc(sizeof(int)*size);
	}
	for(int i = 0;i < size;i++)
	{
		for(int j = 0;j < size;j++)
		{
			b[i][j] = -1;
		}
		//puts("");
	}
	
	printf("输入残缺位置(行 列):");
	scanf("%d %d",&qa,&qb);
	int dr,dc;
	dr = qa;
	dc = qb;
	int t1 = 1; 
	
	if((qa < size && qa >= 0) && (qb < size && qb >= 0))
	{
		b[qa][qb] = 0;
		generateBoard(0,0,dr,dc,size,b,&t1);
		
		for(int i = 0;i < size;i++)
		{
			for(int j = 0;j < size;j++)
			{
				printf("%2d  ",b[i][j]); 
			}
			puts("");
		}
	}
	else
	{
		printf("残缺位置不在棋盘上,位置不合法!");
	}
	for(int i = 0;i < size;i++)
	{
		free(b[i]);
	}
	system("pause");
	return 0;
}

二、 MyCoverBoardB.c

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int qa,qb;
int mpow(int n,int k)
{
	int i;
	int t = n;
	for(i = 1; i < k;i++)
	{
		t = t * n;
	}
	return t;
}
void generateBoard(int tr,int tc,int dr,int dc,int size,int** b)
{
	int hs = size / 2;
	if(size == 2)
	{
		if( dr == tr && dc == tc )
		{
			//残缺位置在4格左上角 
			//用3号覆盖
			b[tr][tc+1] = 3;
			b[tr+1][tc] = 3;
			b[tr+1][tc+1] = 3;
		}
		if( dr== tr && dc == tc + 1)
		{
			//残缺位置在4格右上角 
			//用4号覆盖
			b[tr][tc] = 4;
			b[tr+1][tc] = 4;
			b[tr+1][tc+1] = 4;
		}
		if( dr == tr + 1 && dc == tc)
		{
			//残缺位置在4格左下角 
			//用1号覆盖
			b[tr][tc] = 1;
			b[tr][tc+1] = 1;
			b[tr+1][tc+1] = 1;	
		}
		if( dr == tr + 1 && dc == tc +1)
		{
			//残缺位置在4格右下角 
			//用2号覆盖
			b[tr][tc] = 2;
			b[tr][tc+1] = 2;
			b[tr+1][tc] = 2;	
		}
/*
		for(int i = 0;i < 2*size;i++)
		{
			for(int j = 0;j < 2*size;j++)
			{
				printf("%d\t",b[i][j]); 
			}
			puts("");
		}
*/
		//printf("\ntr:%d,tc:%d----------------------\n",tr,tc);
		b[qa][qb] = 0;
		return;
	}
	else
	{
		if(dr < tr + hs && dc < tc + hs)
		{
			int tdr,tdc;
			//残缺在第二象限
			b[tr+hs-1][tc+hs] = 3;
			b[tr+hs][tc+hs-1] = 3;
			b[tr+hs][tc+hs] = 3;
	
			generateBoard(tr,tc,dr,dc,hs,b);
			
			tdr = tr + hs - 1;
			tdc = tc + hs; 
			generateBoard(tr,tc+hs,tdr,tdc,hs,b);
			
			tdr = tr + hs;
			tdc = tc + hs - 1; 
			generateBoard(tr+hs,tc,tdr,tdc,hs,b);
			
			tdr = tr + hs;
			tdc = tc + hs; 
			generateBoard(tr+hs,tc+hs,tdr,tdc,hs,b);
			
		}
		if(dr < tr + hs && dc >= tc + hs)
		{
			int tdr,tdc;
			//残缺在第一象限
			b[tr+hs-1][tc+hs-1] = 4;
			b[tr+hs][tc+hs-1] = 4;
			b[tr+hs][tc+hs] = 4;
			generateBoard(tr,tc+hs,dr,dc,hs,b);
			
			tdr = tr + hs - 1;
			tdc = tc + hs - 1; 
			generateBoard(tr,tc,tdr,tdc,hs,b);
			//generateBoard(tr,tc+hs,dr,dc,hs,b);
			
			tdr = tr + hs;
			tdc = tc + hs - 1; 
			generateBoard(tr+hs,tc,tdr,tdc,hs,b);

			tdr = tr + hs;
			tdc = tc + hs; 
			generateBoard(tr+hs,tc+hs,tdr,tdc,hs,b);
		}
		if(dr >= tr + hs && dc < tc + hs)
		{
			int tdr,tdc;
			//残缺在第三象限
			b[tr+hs-1][tc+hs-1] = 1;
			b[tr+hs-1][tc+hs] = 1;
			b[tr+hs][tc+hs] = 1;
			generateBoard(tr+hs,tc,dr,dc,hs,b);
			
			tdr = tr + hs - 1;
			tdc = tc + hs - 1; 
			generateBoard(tr,tc,tdr,tdc,hs,b);

			tdr = tr + hs - 1;
			tdc = tc + hs; 
			generateBoard(tr,tc+hs,tdr,tdc,hs,b);
			//generateBoard(tr+hs,tc,dr,dc,hs,b);
			
			tdr = tr + hs;
			tdc = tc + hs; 
			generateBoard(tr+hs,tc+hs,tdr,tdc,hs,b);
		}
		if(dr >= tr + hs && dc >= tc + hs)
		{
			int tdr,tdc;
			//残缺在第四象限
			b[tr+hs-1][tc+hs-1] = 2;
			b[tr+hs-1][tc+hs] = 2;
			b[tr+hs][tc+hs-1] = 2;
			generateBoard(tr+hs,tc+hs,dr,dc,hs,b);
			
			tdr = tr+hs-1;
			tdc = tc+hs-1;
			generateBoard(tr,tc,tdr,tdc,hs,b);
			
			tdr = tr+hs-1;
			tdc = tc+hs;
			generateBoard(tr,tc+hs,tdr,tdc,hs,b);
			
			tdr = tr+hs;
			tdc = tc+hs-1;
			generateBoard(tr+hs,tc,tdr,tdc,hs,b);
			//generateBoard(tr+hs,tc+hs,dr,dc,hs,b);
		}
	} 
}
int main()
{
	//左下残缺 右下残缺 左上残缺 右上残缺
	//1 1      2 2        3      4
	//  1      2        3 3      4 4
	//把基础的四格情况分为四种样式的图形,去图形式的填充
	
	int k;
	printf("输入棋盘2^k×2^k的k值:");
	scanf("%d",&k);
	int size = mpow(2,k);
	//printf("size = %d\n",size);
	
	int *b[size]; //生成棋盘矩阵
	for(int i = 0;i < size;i++)
	{
		b[i] = (int*)malloc(sizeof(int)*size);
	}
	for(int i = 0;i < size;i++)
	{
		for(int j = 0;j < size;j++)
		{
			b[i][j] = -1;
		}
		//puts("");
	}
	
	printf("输入残缺位置(行 列):");
	scanf("%d %d",&qa,&qb);
	int dr,dc;
	dr = qa;
	dc = qb;
	
	if((qa < size && qa >= 0) && (qb < size && qb >= 0))
	{
		b[qa][qb] = 0;
		generateBoard(0,0,dr,dc,size,b);
		
		for(int i = 0;i < size;i++)
		{
			for(int j = 0;j < size;j++)
			{
				printf("%d  ",b[i][j]); 
			}
			puts("");
		}
	}
	else
	{
		printf("残缺位置不在棋盘上,位置不合法!");
	}
	for(int i = 0;i < size;i++)
	{
		free(b[i]);
	}
	system("pause");
	return 0;
}

MyCoverBoardA.c-运行结果示例

1.k为1

棋盘覆盖python 棋盘覆盖问题c语言_棋盘覆盖问题

棋盘覆盖python 棋盘覆盖问题c语言_棋盘覆盖问题_02

2.k为2

棋盘覆盖python 棋盘覆盖问题c语言_c语言_03

棋盘覆盖python 棋盘覆盖问题c语言_c语言_04

3.k为3

棋盘覆盖python 棋盘覆盖问题c语言_c语言_05

棋盘覆盖python 棋盘覆盖问题c语言_棋盘覆盖问题_06

4.k为4

4.1   3.1缺陷在12 9位置

棋盘覆盖python 棋盘覆盖问题c语言_分治法_07


MyCoverBoardB.c-运行结果示例

1.k为1

棋盘覆盖python 棋盘覆盖问题c语言_c语言_08

棋盘覆盖python 棋盘覆盖问题c语言_c语言_09

棋盘覆盖python 棋盘覆盖问题c语言_c语言_10

棋盘覆盖python 棋盘覆盖问题c语言_分治法_11

2.k为2

棋盘覆盖python 棋盘覆盖问题c语言_图形式填充_12

棋盘覆盖python 棋盘覆盖问题c语言_棋盘覆盖问题_13

3.k为3

棋盘覆盖python 棋盘覆盖问题c语言_棋盘覆盖问题_14

棋盘覆盖python 棋盘覆盖问题c语言_c语言_15

4.k为4

4.1   3.1缺陷在12 9位置

棋盘覆盖python 棋盘覆盖问题c语言_棋盘覆盖python_16