构造解数独

6 篇文章 0 订阅
1 篇文章 0 订阅
public class Sudoku {
	int sd[][];
	public Sudoku(int sd_[][]){
		sd=sd_;
	}
	
	
	//寻找横坐标下一位置
	int findx(int x,int y){
		if(y==8)
			return x+1;
		else
			return x;
	}

	
	//寻找纵坐标下一位置
	int findy(int x,int y){
		if(y==8)
			return 0;
		else
			return y+1;
	}
	
	
	//输出完成的数独矩阵
	void sdPrint(){
		for(int x = 0;x<9;x++){
			for(int y = 0;y<9;y++){
				System.out.print(sd[x][y]+"   ");
			}
			System.out.print("\n");
		}
		System.out.print("=================="+"\n");
	}
	
	
	//判断当前位置是否可以放置
	int canSet(int k,int x,int y){
		//判断横数列有重复否
		for(int i=0;i<9;i++){
			if(k==sd[i][y]||k==sd[x][i])
				return 0;
		}
		//判断3×3列有重复否
		for(int j=0;j<3;j++){
			for(int m=0;m<3;m++){
				if(k==sd[x/3*3+j][y/3*3+m])
					return 0;
			}
		}
		return 1;
	}
	
	
	void searchSet(int n,int x,int y){
		//判断当前位置是否能改变
		if(sd[x][y]!=0){
			if(n==80){
				sdPrint();
				return;	
			}
			searchSet(n+1,findx(x,y),findy(x,y));
			return;
		}
		
		//由9~1依次判断
		for(int i=9;i>0;i--){
			if(canSet(i,x,y)==1){
				sd[x][y]=i;
				if(n==80){
					sdPrint();
					return;
				}
				searchSet(n+1,findx(x,y),findy(x,y));
			}
			sd[x][y]=0;
		}
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值