蓝桥杯第五届java省赛第六题:数独

题目:

你一定听说过“数独”游戏。
如【图1.png】,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个同色九宫内的数字均含1-9,不重复。
数独的答案都是唯一的,所以,多个解也称为无解。
本图的数字据说是芬兰数学家花了3个月的时间设计出来的较难的题目。但对会使用计算机编程的你来说,恐怕易如反掌了。
本题的要求就是输入数独题目,程序输出数独的唯一解。我们保证所有已知数据的格式都是合法的,并且题目有唯一的解。
格式要求,输入9行,每行9个字符,0代表未知,其它数字为已知。
输出9行,每行9个数字表示数独的解。
例如:
输入(即图中题目):
005300000
800000020
070010500
400005300
010070006
003200080
060500009
004000030

000009700

程序应该输出:
145327698
839654127
672918543
496185372
218473956
753296481
367542819
984761235
521839764

再例如,输入:
800000000
003600000
070090200
050007000
000045700
000100030
001000068
008500010
090000400

程序应该输出:
812753649

943682175

答案:

import java.util.Scanner;

public class Main {
	public static void main(String[] args){
		Scanner in=new Scanner(System.in);
		int[][] arr=new int[9][9];
		String[] ar=new String[9];
		for(int i=0;i<9;i++){
			ar[i]=in.next();
		}
		for(int i=0;i<9;i++){
			for(int j=0;j<9;j++){
				arr[i][j]=(ar[i].charAt(j)-48);
			}
		}
		//以上为输出数据到二维数组,注意到输入数据没有空格,所以只能从字符串转换成数字
		p(arr,0,0);//递归
	}
	public static void p(int[][] arr,int i,int j){
		if(j==9){//如果到最后一行了,跳到下一列第一行
			p(arr,i+1,0);
			return;
			}
		if(i==9){//如果到最后一列,输出
			for(int i1=0;i1<9;i1++){
				for(int j1=0;j1<9;j1++){
					System.out.print(arr[i1][j1]);
				}
				System.out.println();
			}
			return;
		}
		if(arr[i][j]!=0){//如果此格有数字,跳下一格
			p(arr,i,j+1);
			return;
			}
		for(int x=1;x<=9;x++){//开始填数
			boolean bo=true;
			for(int i1=0;i1<9;i1++){//判断行列有没有一样的数
				if(arr[i][i1]==x||arr[i1][j]==x){
					bo=false;
					break;
				}
			}
			int i1,j1;
			if(i<3)
				i1=0;
			else if(i<6)
				i1=3;
			else i1=6;
			
			if(j<3)
				j1=0;
			else if(j<6)
				j1=3;
			else j1=6;
			for(int ii=0;ii<3&&bo;ii++){//判断九宫格内有没有一样的数
				for(int jj=0;jj<3&&bo;jj++){
					if(arr[i1+ii][j1+jj]==x){
						bo=false;
					}
				}
			}
			if(bo){
				arr[i][j]=x;
				p(arr,i,j+1);
				arr[i][j]=0;
			}
		}
		return;//此格无法填数,当前线程结束
	}
}

分析:因为内存和时间都不会超时,所以问题不大,递归穷举即可。

总结:

1.注意输入和输出的格式,否则很有可能导致输入的数据无法成功读取,或者输出错误零分。

2.当时间空间都不会出现超额,那就大胆的写代码,做出正确结果即可。

猜你喜欢

转载自blog.csdn.net/amu435784334/article/details/80040092