根据书上给的算法 ,我写了这个小程序,见笑了。
#include
<
stdio.h
>
#define MAXSIZE 16
int chess[MAXSIZE][MAXSIZE];
void chess_board( int tr, int tc, int dr, int dc, int size)
... {
static int tile = 1;
if(1==size) return;
int t = tile++;
int s = size/2;
/**//**//**//* ---- left-up corner ---- */
if(dr<tr+s && dc<tc+s)...{
chess_board(tr, tc, dr, dc, s);
} else ...{
chess[tr+s-1][tc+s-1] = t;
chess_board(tr, tc, tr+s-1, tc+s-1, s);
}
/**//**//**//* ---- right-up corner --- */
if(dr<tr+s && dc>=tc+s)...{
chess_board(tr, tc+s, dr, dc, s);
} else ...{
chess[tr+s-1][tc+s] = t;
chess_board(tr, tc+s, tr+s-1, tc+s, s);
}
/**//**//**//* ---- left-down corner--- */
if(dr>=tr+s && dc<tc+s)...{
chess_board(tr+s, tc, dr, dc, s);
} else ...{
chess[tr+s][tc+s-1] = t;
chess_board(tr+s, tc, tr+s, tc+s-1, s);
}
/**//**//**//* ---- right-down corner-- */
if(dr>=tr+s && dc>=tc+s)...{
chess_board(tr+s, tc+s, dr, dc, s);
} else ...{
chess[tr+s][tc+s] = t;
chess_board(tr+s, tc+s, tr+s, tc+s, s);
}
}
void print_chess( int size, int a, int b)
... {
int i, j;
for(i = 0; i<size; i++)...{
for(j=0; j<size; j++)...{
if(i==(a-1)&&j==(b-1))
printf("%3c",2);
else
printf("%3d",chess[i][j]);
}
printf(" ");
}
}
int main( int argc, char * argv[] )
... {
int a=0,b=0,c=0;
printf("********************************************************* ");
printf("* 实验一:棋盘覆盖算法 * ");
printf("********************************************************* ");
printf(" 请输入您的棋盘的边长(注意:边长需要是2的N次方数):");
scanf("%d",&a);
while(a>MAXSIZE)
...{
printf("您输入的棋盘太大了,无法完成绘画: ");
printf(" 请输入您的棋盘的边长(注意:边长需要是2的N次方数):");
scanf("%d",&a);
}
printf("请输入您的棋盘的特殊方格的位置(中间逗号隔开):");
scanf("%d,%d",&b,&c);
printf("您的棋盘: ");
print_chess(a,b,c);
chess_board(0, 0, b-1, c-1, a);
printf("您实现棋盘覆盖后的棋盘: ");
print_chess(a,b,c);
printf("谢谢使用,再见!_ ");
return 0;
}
#define MAXSIZE 16
int chess[MAXSIZE][MAXSIZE];
void chess_board( int tr, int tc, int dr, int dc, int size)
... {
static int tile = 1;
if(1==size) return;
int t = tile++;
int s = size/2;
/**//**//**//* ---- left-up corner ---- */
if(dr<tr+s && dc<tc+s)...{
chess_board(tr, tc, dr, dc, s);
} else ...{
chess[tr+s-1][tc+s-1] = t;
chess_board(tr, tc, tr+s-1, tc+s-1, s);
}
/**//**//**//* ---- right-up corner --- */
if(dr<tr+s && dc>=tc+s)...{
chess_board(tr, tc+s, dr, dc, s);
} else ...{
chess[tr+s-1][tc+s] = t;
chess_board(tr, tc+s, tr+s-1, tc+s, s);
}
/**//**//**//* ---- left-down corner--- */
if(dr>=tr+s && dc<tc+s)...{
chess_board(tr+s, tc, dr, dc, s);
} else ...{
chess[tr+s][tc+s-1] = t;
chess_board(tr+s, tc, tr+s, tc+s-1, s);
}
/**//**//**//* ---- right-down corner-- */
if(dr>=tr+s && dc>=tc+s)...{
chess_board(tr+s, tc+s, dr, dc, s);
} else ...{
chess[tr+s][tc+s] = t;
chess_board(tr+s, tc+s, tr+s, tc+s, s);
}
}
void print_chess( int size, int a, int b)
... {
int i, j;
for(i = 0; i<size; i++)...{
for(j=0; j<size; j++)...{
if(i==(a-1)&&j==(b-1))
printf("%3c",2);
else
printf("%3d",chess[i][j]);
}
printf(" ");
}
}
int main( int argc, char * argv[] )
... {
int a=0,b=0,c=0;
printf("********************************************************* ");
printf("* 实验一:棋盘覆盖算法 * ");
printf("********************************************************* ");
printf(" 请输入您的棋盘的边长(注意:边长需要是2的N次方数):");
scanf("%d",&a);
while(a>MAXSIZE)
...{
printf("您输入的棋盘太大了,无法完成绘画: ");
printf(" 请输入您的棋盘的边长(注意:边长需要是2的N次方数):");
scanf("%d",&a);
}
printf("请输入您的棋盘的特殊方格的位置(中间逗号隔开):");
scanf("%d,%d",&b,&c);
printf("您的棋盘: ");
print_chess(a,b,c);
chess_board(0, 0, b-1, c-1, a);
printf("您实现棋盘覆盖后的棋盘: ");
print_chess(a,b,c);
printf("谢谢使用,再见!_ ");
return 0;
}