华为笔试题:数独的填充

为什么我这样写会出现死循环呢?


package 华为笔试;

import java.util.ArrayList;
import java.util.Scanner;

public class 数独 {
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int [][]array=new int[9][9];
        ArrayList<int[]> list=new ArrayList<>();
        while(sc.hasNext()){
            for(int i=0;i<9;i++){
                for(int j=0;j<9;j++){
                    array[i][j]=sc.nextInt();
                    if(array[i][j]==0){
                        int[]index=new int[2];
                        index[0]=i;
                        index[1]=j;
                        list.add(index);
                    }
                }
            }
            dfs(0,array,list);
            for(int i=0;i<9;i++){
                for(int j=0;j<9;j++){
                    System.out.print(array[i][j]+" ");
                }
                System.out.println();
            }
            list=new ArrayList<>();
        }
    }
    //num用来记录已经多少个0填充了数据
    public static boolean dfs(int num,int [][]array,ArrayList<int[]> list){
        if(num>=list.size()){
            return true;
        }
        for(int[] arr:list){
            int X=arr[0];
            int Y=arr[1];
            if(array[X][Y]==0){
                for(int i=1;i<=9;i++){
                    if(canRun(X,Y,i,array)){
                        array[X][Y]=i;
                        if(dfs(num+1,array,list))
                            return true;
                        array[X][Y]=0;
                    }
                }
            }
        }
        return false;

    }
    public static boolean canRun(int row,int col,int c,int [][] array){
        
        for (int i = 0; i < array.length; i++) {
            if (array[i][col] == c)
                return false;
            if (array[row][i] == c)
                return false;
        }
 
        int xBegin = (row / 3) * 3, yBegin = (col / 3) * 3;
 
        for (int i = xBegin; i < xBegin + 3; i++) {
            for (int j = yBegin; j < yBegin + 3; j++) {
                if (array[i][j] == c)
                    return false;
            }
        }
 
        return true;
        
    }
}


测试用例:
0 9 5 0 2 0 0 6 0
0 0 7 1 0 3 9 0 2
6 0 0 0 0 5 3 0 4
0 4 0 0 1 0 6 0 7
5 0 0 2 0 7 0 0 9
7 0 3 0 9 0 0 2 0
0 0 9 8 0 0 0 0 6
8 0 6 3 0 2 1 0 5
0 5 0 0 7 0 2 8 3

对应输出应该为:

3 9 5 7 2 4 8 6 1
4 8 7 1 6 3 9 5 2
6 2 1 9 8 5 3 7 4
9 4 2 5 1 8 6 3 7
5 6 8 2 3 7 4 1 9
7 1 3 4 9 6 5 2 8
2 3 9 8 5 1 7 4 6
8 7 6 3 4 2 1 9 5
1 5 4 6 7 9 2 8 3
#华为#
全部评论
list应该是需要填充的位置吧。为什么每次dfs都从第一个开始?不应该填了一个,再填下一个嘛?
点赞 回复 分享
发布于 2018-08-06 23:10
我知道了 ,这里面少了一个关键的减枝,就是当一个节点当它取完1-9之后还不能返回true,则直接返回false!
点赞 回复 分享
发布于 2018-08-08 16:19
数独算法最明显的解法是使用回溯算法,这样不需要记录历史填充。同时为了提高运算速度,使用bool数组判断是否使用过
点赞 回复 分享
发布于 2022-04-24 17:55

相关推荐

TCL的面经包括多个环节,‌具体如下:‌笔试:‌可能包括数学计算、‌逻辑推图、‌演绎推理和英文阅读等内容,‌题量较大,‌需要在有限时间内尽可能多答对题目‌。‌性格测评:‌通过在线链接完成,‌测评结果可能影响后续的面试环节‌。‌面试:‌一面(‌业务面)‌:‌主要进行自我介绍,‌询问优缺点、‌实习经历、‌项目经历、‌兴趣爱好、‌岗位选择、‌职业规划等‌。‌二面(‌HR面)‌:‌深入挖掘实习经历和项目经历,‌询问对产品经理业务方向的理解、‌工作职责、‌加班意愿、‌薪资预期等‌2。‌三面(‌部门主管面)‌:‌对实习经历和项目经历进行更深入的挖掘,‌询问职业规划、‌产品经理的C端及B端区别、‌面对困难的克服方式等‌。‌四面(‌总经理面)‌:‌进行自我介绍,‌询问投递岗位的原因、‌未来3-5年的计划等‌。‌整体而言,‌TCL的面试流程相对规范,‌注重考察应聘者的专业技能、‌项目经验、‌综合素质以及职业规划等方面。‌🔥TCL25届校园招聘火热进行中!【招聘岗位】研发技术类、市场营销类、产品设计类、智能制造类、综合管理类、财务金融类、供应链类&nbsp;信息技术类,人力资源类【工作地点】深圳、惠州、中山、合肥、米哈游、上海、宁波等,部分营销类岗位工作地覆盖全球【薪酬待遇】丰富的薪酬结构,行业领先的薪酬回报TCL实业【网申链接】https://actyco.wintalent.cn/actyco/home/receiver/poster/redirect?id=2ce781ac9082ff0d01909a1f3ff30d1a【内推码】ixgnqy(简历优先被筛选,加速流程推进)TCL华星内推链接:https://wecruit.hotjob.cn/SU6491506a2f9d24316e91b81b/mc/position/campus?acotycoCode=tmktjn&amp;amp;amp;orgId=100801&amp;amp;amp;projectId=307101&amp;amp;amp;recruitType=1&amp;amp;amp;isLimitShowPostScope=1【内推码】tmktjn投递的uu评论一下姓名缩写加岗位(HFG+产品经理),我会尽力跟进~
TCL实业
|
校招
|
超多精选岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务