#include<stdio.h>
int amount=0;
int 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)))
{
cover(tr,tc,dr,dc,s);
board[tr+s-1][tc+s]=t; //覆盖1号三格板
board[tr+s][tc+s-1]=t;
board[tr+s][tc+s]=t;
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)))
{
cover(tr,tc+s,dr,dc,s);
board[tr+s-1][tc+s-1]=t; //覆盖2号三格板
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+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)))
{
cover(tr+s,tc,dr,dc,s);
board[tr+s-1][tc+s-1]=t; //覆盖3号三格板
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+s,tr+s,tc+s,s);
}
else if((dr>=(tr+s))&&(dc>=(tc+s)))
{
cover(tr+s,tc+s,dr,dc,s);
board[tr+s-1][tc+s-1]=t; //覆盖4号三格板
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);
}
}
void outputboard(int size){
for(int i=0;i<size;i++)
{
for(int j=0;j<size;j++)
printf("%d ",board[i][j]);
printf("\n");}
}
void main(){
int size=1,x,y,k;
printf("请输入k的值\n");
scanf("%d",&k);
for(int i=1;i<=k;i++)
size=size*2;
printf("请输入残缺模块所在的行和列,以空格相隔\n");
scanf("%d %d",&x,&y);
if(x<k&&y<k)
cover(0,0,x,y,size);
else
printf("输入行和列有误\n");
outputboard(size);
}
2014年06月09日 14点06分
17