1 需求介绍
作业题目:奇数九宫格的自动填充
作业目的:测试判断语句与循环语句的使用
2 技术描述
- 第一行(数组第0行)的正中间放入1。
- 下一个数总是放在放好的这个数的右上角45°,考虑有以下两种情况:
行越界:把这个数放到同列的最后一行。
列越界:把这个数放到同行的首列。
- 如果遇到n的整数倍数,则放到上个数的正下方,也有两种情况:
行列同时越界。
冲突(位置上已经有了数字)
4.定义二维数组时默认全为0,判断位置上若不为0,则产生冲突。
3 主要功能代码
import java.util.*;
public class Cc {
public static void show(int[][] b,int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
System.out.print(b[i][j]+"\t");
}
System.out.print("\n");
}
}
public static void fill(int[][] a,int n, int y, int x)
{
for(int i=1;i<=n*n;i++)
{
a[y][x] = i;
y--;
x++;
if(y<0&&x<n)
{
y = n-1;
}
if(y>=0&&x==n)
{
x = 0;
}
if((y<0&&x==n)||a[y][x]!=0)
{
y=y+2;
x--;
}
}
}
public static void main(String[] args)
{
System.out.println("输入一个数字(打印九宫格N*N格)");
Scanner in = new Scanner(System.in);
int n = in.nextInt();
System.out.println("打印"+n+"*"+n+"的九宫格");
if(n%2==0)
{
System.out.println("Error");
}
int[][] a = new int[n][n];
int y = 0;
int x = n/2;
fill(a,n,y,x);
show(a,n);
}
}
4成果展示
这里自动填充九宫格并不包含所有方案的结果,
如果要全部找出,可以考虑dfs暴力搜索,剪枝法优化算法。