棋盘问题利用分治思想将子问题与原问题的问题类型一样但是让子问题的规模不断缩小,直到很容易求出直接求出解。
当问题规模为n时可以将方块分解为规模为2的规模
#include <stdio.h>
const int N=8;//N的值必须为2^k,如1、2、4、8、16
int qipan[N][N];
int number=0;
void chessBoard(int row,int column,int x,int y,int size)//棋盘起始方格下标(左上角),特殊方格下标,棋盘大小size*size
{
if(size==1) return;
int s=size/2;
int t=++number;
int centerR=row+s;
int centerC=column+s;
if(x<centerR&&y<centerC)
chessBoard(row,column,x,y,s);
else
{
qipan[centerR-1][centerC-1]=t;
chessBoard(row,column,centerR-1,centerC-1,s);
}
if(x>=centerR&&y<centerC)
chessBoard(centerR,column,x,y,s);
else
{
qipan[centerR][centerC-1]=t;
chessBoard(centerR,column,centerR,centerC-1,s);
}
if(x<centerR&&y>=centerC)
chessBoard(row,centerC,x,y,s);
else
{
qipan[centerR-1][centerC]=t;
chessBoard(row,centerC,centerR-1,centerC,s);
}
if(x>=centerR&&y>=centerC)
chessBoard(centerR,centerC,x,y,s);
else
{
qipan[centerR][centerC]=t;
chessBoard(centerR,centerC,centerR,centerC,s);
}
}
void main()
{
int i,j;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
qipan[i][j]=0;
printf("%02d ",qipan[i][j]);
}
printf("\n");
}
printf("请输入特殊方格的位置:");
scanf("%d%d",&i,&j);
chessBoard(0,0,i,j,N);//棋盘起始方格下标(左上角),特殊方格下标,棋盘大小size*size
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
printf("%02d ",qipan[i][j]);
}
printf("\n");
}
}