1)初始化
import java,util.Scanner
public class ChessBoard {
int a;//表示初始时黑色格子的行
int b;//表示初始时黑色格子的列
int tile=2;//表示开始时填入表格中的数字
int[][] board;//表示2^k*2^k的表格
int size;//由外界输入表格大小;
public ChessBoard() {
}
//初始化a
public void get_a(int a) {
this.a=a;
}
//初始化b
public void get_b(int b) {
this.b=b;
}
//初始化size和board
public boolean getSize(int size) {
if(size>0&&((size&(size-1))==0)) //判断输入的大小是否是2的次方数,是则返回false,不是则返回true(因为在主函数中使用了while循环来确定)
{this.board=new int[size][size];
this.size=size;
for(int i=0;i<size;i++)
{
for(int j=0;j<size;j++)
{
board[i][j]=0;
}
}
board[a][b]=1;
//初始化结束,输出一下原有的board里面是什么样
for(int i=0;i<size;i++)
{
for(int j=0;j<size;j++)
{
System.out.print(board[i][j]+"\t");
}
System.out.println();
}
return false;
}
else
return true;
}
2)创建递归函数:chessboarded;
public void chessboarded(int tr,int tc,int dr,int dc,int size) {
if(size==1) return ;//判断退出条件,如果只剩下大小为1,那么表示已经结束这个格子的涂色
int t=tile++;//填充的数字+1
int s=size/2;//变为大小的一半来划分四个区域
//因为从左上角开始,所以,应该为+,而非减
if(dr<tr+s&&dc<tc+s)
{
chessboarded(tr,tc,dr,dc,s);//如果在黑格在这个地方,那么继续缩小范围
}
else//黑格不在这个地方,那么将这个的右下角的格子覆盖;
{
board[tr+s-1][tc+s-1]=t;//减1是因为从0开始;此时,将这个格子涂黑,黑格坐标发生改变;
chessboarded(tr,tc,tr+s-1,tc+s-1,s);
}
//到达右上角,右上角和左上角拥有同样的行,但不同的列
if(dr<tr+s &&dc>=tc+s)
{
chessboarded(tr,tc+s,dr,dc,s);
}
else
{
board[tr+s-1][tc+s]=t;//相对于整个图而言,这个坐标位于左下角,因此这个地方刚好为tr+s,tc+s;
chessboarded(tr,tc+s,tr+s-1,tc+s,s);
}
//到达左下角,左下角和左上角拥有相同的列,但不同的行
if(dr>=tr+s&&dc<tc+s)
{
chessboarded(tr+s,tc,dr,dc,s);
}
else
{
board[tr+s][tc+s-1]=t;
chessboarded(tr+s,tc,tr+s,tc+s-1,s);
}
//到达右下角,右下角与右上角拥有相同的列,与左下角拥有相同的行;
if(dr>=tr+s&&dc>=tc+s)
{
chessboarded(tr+s,tc+s,dr,dc,s);
}
else
{
board[tr+s][tc+s]=t;
chessboarded(tr+s,tc+s,tr+s,tc+s,s);
}
}
3)主函数部分:由人为键入a,b,size,这里也可以放入chessBoard里面,使得代码更加模块化;
@SuppressWarnings("resource")
public static void main(String[] args) {
boolean flag=true;
ChessBoard chessboard=new ChessBoard();
System.out.println("请输入黑色格子的位置:先输入行,在输入列a,b从0开始:");
Scanner black_lattice_a=new Scanner(System.in);
Scanner black_lattice_b=new Scanner(System.in);
chessboard.get_a(black_lattice_a.nextInt());
chessboard.get_b(black_lattice_b.nextInt());
while(flag)
{
System.out.println("请输入格子的大小,其必须是2的幂函数:例如:2^2,2^3,2^4");
Scanner size=new Scanner(System.in);
flag=chessboard.getSize(size.nextInt());
}
//初始化结束,开始运行
chessboard.chessboarded(0, 0, chessboard.a, chessboard.b, chessboard.size);
//运行结果:
System.out.println("棋盘最后的结果为:");
for(int i=0;i<chessboard.size;i++)
{
for(int j=0;j<chessboard.size;j++)
{
System.out.print(chessboard.board[i][j]+"\t");
}
System.out.println();
}
}
}
代码优化:1.将输出部分合并,合并为tostring方法,
2.将a,b的值在进行一次判断,如果不合格,同样使用while来得到正确的输入,并且可以因为键入q或者exit()来结束程序。
3。键入a,b的时候,让用户不需要考虑是从0开始还是从1开始,统一为从1开始,但是要求就要将键入时的值在程序中减1;