黑马程序员---java算法实现输出任意奇数维数独

时间:2022-04-04 22:19:31

java算法实现输出任意奇数维数独

----------- android培训java培训、java学习型技术博客、期待与您交流! -----------

/**
该类可以打印任意维数数独,但是必须是奇数维数
@author 传智播客 java1208-66#
*/
class ShuDuDemo//测试数独
{
public static void main(String[] args)
{
ShuDu sd1=new ShuDu(3);//测试打印三维数独
sd1.run();
System.out.println("------------------------");

ShuDu sd2=new ShuDu(5);//测试打印五维数独
sd2.run();
System.out.println("------------------------");

ShuDu sd3=new ShuDu(7);//测试打印7维数独
sd3.run();
System.out.println("------------------------");

ShuDu sd4=new ShuDu(9);
sd4.run();
System.out.println("------------------------");
}
}
/**
自定义的数独类,可以计算出所有排列的任意奇数维数数独
将数独封装成一个对象,同过构造器来创建任意奇数维的数独对象
*/
class ShuDu//打印3*3的数独
{
private int radius;//定义基数
//构造器
public ShuDu(int radius)
{
this.radius=radius;
}
private void init(int[][] arr)//初始化数组,使默认值为0
{
for(int i=0;i<arr.length;i++)
{
for(int j=0;j<arr[i].length;j++)
{
arr[i][j]=0;
}
}
}
public void run()//接受一个维数,一定要为奇数
{
int[][] arr=new int[radius][radius];
init(arr);
int x=0,y=0;//定义x,y作为二维数组的脚标
int tar=1;//定义应该填入的数字大小,从1开始

x=0;y=radius/2;tar=1;//初始化
init(arr);//初始化
arr[x][y]=tar++;
while(tar<=radius*radius)
{
int tempx=x;
int tempy=y;
x=x+2>radius-1?x+2-radius:x+2;//x=x+2,并作出越界处理
y=y+1>radius-1?y+1-radius:y+1;//y=y+1,并作出越界处理
if(arr[x][y]==0)
{arr[x][y]=tar++;}
else
{
x=tempx+1>radius-1?tempx+1-radius:tempx+1;
y=tempy;
arr[x][y]=tar++;
}
}
show(arr);
System.out.println("------------------------");
}
private void show(int[][] arr)//打印数组
{
System.out.println("打印 "+ radius+"*"+radius+" 数独:");
for(int i=0;i<arr.length;i++)
{
for(int j=0;j<arr[i].length;j++)
{
System.out.print(arr[i][j]+"\t");
}
System.out.println();
}
}
}
测试结果:
打印 3*3 数独:
8 1 6
3 5 7
4 9 2
------------------------
------------------------
打印 5*5 数独:
23 12 1 20 9
4 18 7 21 15
10 24 13 2 16
11 5 19 8 22
17 6 25 14 3
------------------------
------------------------
打印 7*7 数独:
46 31 16 1 42 27 12
5 39 24 9 43 35 20
13 47 32 17 2 36 28
21 6 40 25 10 44 29
22 14 48 33 18 3 37
30 15 7 41 26 11 45
38 23 8 49 34 19 4
------------------------
------------------------
打印 13*13 数独:
163 136 109 82 55 28 1 156 129 102 75 48 21
8 150 123 96 69 42 15 157 143 116 89 62 35
22 164 137 110 83 56 29 2 144 130 103 76 49
36 9 151 124 97 70 43 16 158 131 117 90 63
50 23 165 138 111 84 57 30 3 145 118 104 77
64 37 10 152 125 98 71 44 17 159 132 105 91
78 51 24 166 139 112 85 58 31 4 146 119 92
79 65 38 11 153 126 99 72 45 18 160 133 106
93 66 52 25 167 140 113 86 59 32 5 147 120
107 80 53 39 12 154 127 100 73 46 19 161 134
121 94 67 40 26 168 141 114 87 60 33 6 148
135 108 81 54 27 13 155 128 101 74 47 20 162
149 122 95 68 41 14 169 142 115 88 61 34 7
------------------------
------------------------