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

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	
------------------------
------------------------


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值