打卡:听课笔记数独游戏

题目:玩家需要根据9*9盘上的已知数字,推理出所有剩余空格的数字,并满足每一行,每一列,每一个同色九宫内的数字均含有1-9,不重复

005300000

800000020

070010500

400005300

010070006

003200080

060500009

004000030

000009700

描述:

import java.util.Scanner;

public class Main {
    
    
    
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        Scanner sc = new Scanner(System.in);
    /*    int a = sc.nextInt();
        int b = sc.nextInt(); */

        char arr[][] = new char[9][9];
        for(int i=0;i<9;i++) {
            String str = sc.next();
            arr[i] = str.toCharArray();
        }
    /*    for(int i=0;i<a;i++) {
            System.out.println(arr[i]);
        }*/

        dfs(arr,0,0);
    }
    public static void dfs(char arr[][],int x,int y) {
        //出口
        if(x==9 ) {
            for(int i=0;i<9;i++) {
                System.out.println(arr[i]);
            }
            return;
        }
        //测试这个位置能不能放
        if(arr[x][y]=='0') {
            //放入1-9
            for(int i=1;i<10;i++) {
                //检查是否有重复
                boolean flag = check(arr,x,y,i);
                //如果在规定的格式内都没有重复的话
                if(flag) {
                    //将i放入
                    arr[x][y] = (char)('0'+i);
                    //然后检查下一个格子
                    dfs(arr,x+(y+1)/9,(y+1)%9);
                }
            }
            //放完之后回溯
            arr[x][y] = '0';
            //如果该格子不能放了数字的话,接着走下一行
        }else {
            dfs(arr,x+(y+1)/9,(y+1)%9);
        }
    }
    public static boolean check(char arr[][],int x,int y,int i) {
    
        char ch = (char)('0'+i);
        
        //检查同行,同列
        for(int m=0;m<9;m++) {
            if(arr[x][m]==ch) return false;
            if(arr[m][y]==ch) return false;
        }
        //检查同一个九宫格
        for(int m=(x/3)*3;m<(x/3+1)*3;m++) {
            for(int n=(y/3)*3;n<(y/3+1)*3;n++) {
                if(arr[m][n]==ch) return false;
            }
        }
        return true;
    }
    
}
 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值