数独口诀_数独技巧xwing推导过程

数独口诀_数独技巧xwing推导过程数独是一种传统益智游戏,你需要把一个 9×9 的数独补充完整,使得图中每行、每列、每个 3×3 的九宫格内数字 1∼9 均恰好出现一次。请编写一个程序填写数独。输入格式输入包含多组测试用例。每个测试用例占一行,包含 81 个字符,代表数独的 81 个格内数据(顺序总体由上到下,同行由左到右)。每个字符都是一个数字(1−9)或一个 .(表示尚未填充)。您可以假设输入中的每个谜题都只有一个解决方案。文件结尾处为包含单词 end 的单行,表示输入结束。输出格式每个测试用例,输出一行数据,代表填充

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

数独是一种传统益智游戏,你需要把一个 9×9 的数独补充完整,使得图中每行、每列、每个 3×3 的九宫格内数字 1∼9 均恰好出现一次。

请编写一个程序填写数独。

输入格式
输入包含多组测试用例。

每个测试用例占一行,包含 81 个字符,代表数独的 81 个格内数据(顺序总体由上到下,同行由左到右)。

每个字符都是一个数字(1−9)或一个 .(表示尚未填充)。

您可以假设输入中的每个谜题都只有一个解决方案。

文件结尾处为包含单词 end 的单行,表示输入结束。

输出格式
每个测试用例,输出一行数据,代表填充完全后的数独。

输入样例:
4.....8.5.3..........7......2.....6.....8.4......1.......6.3.7.5..2.....1.4......
......52..8.4......3...9...5.1...6..2..7........3.....6...1..........7.4.......3.
end
输出样例:
417369825632158947958724316825437169791586432346912758289643571573291684164875293
416837529982465371735129468571298643293746185864351297647913852359682714128574936

题解
剪枝策略:

  1. 有限分支数较少的节点。
  2. 排除等价冗余
  3. 可行性减枝
  4. 最优性减枝
  5. 记忆化搜索
#include<bits/stdc++.h>
using namespace std;
const int N = 9;
char g[N][N];
int col[N],row[N],grid[3][3];
int ones[1 << N];
int Map[1 << N];
int res = 0;
int sum = 0;
string line;
int get(int x,int y){ 
   
    return ones[row[x] & col[y] & grid[x / 3][y / 3]];
}
int lowbit(int x){ 
   
    return (x & (-x));
}
void push(int x,int y,int v){ 
   
    col[y] -= (1 << v);
    row[x] -= (1 << v);
    grid[x / 3][y / 3] -= (1 << v);
    int in = x * 9 + y;
    line[in] = '1' + v;
    g[x][y] = '1' + v;
}
void back(int x,int y,int v){ 
   
    col[y] += (1 << v);
    row[x] += (1 << v);
    grid[x / 3][y / 3] += (1 << v);
    int in = x * 9 + y;
    line[in] = '.';
    g[x][y] = '.';
}
bool dfs(int k){ 
   
    // cout<<k<<endl;
    if(k == sum){ 
   
        cout<<line<<endl;
        return true;
    }
    int x, y, v = 10;
    for(int i = 0;i < N;i ++){ 
   
        for(int j = 0;j < N;j ++){ 
   
            if(g[i][j] == '.'){ 
   
                if(v > get(i,j)){ 
   
                    v = get(i , j);
                    x = i,y = j;
                }
            }
        }
    }
    int t = col[y] & row[x] & grid[x / 3][y / 3];
    while(t > 0){ 
   
        int tt = lowbit(t);
        t -= tt;
        push(x,y,Map[tt]);
        if(dfs(k + 1))return true;
        back(x,y,Map[tt]);
    }
    return false;
}
int main(){ 
   
    for(int i = 0;i < 1 << N;i ++){ 
   
        for(int j = 0;j < N;j ++){ 
   
            if((i >> j) & 1)ones[i] ++;
        }
    }
    for(int i = 0;i < N;i ++)Map[1 << i] = i;
    while(cin>>line,line != "end"){ 
   
        for(int i = 0;i < line.size();i ++){ 
   
            int x = i / N,y = i % N;
            g[x][y] = line[i];
        }
        memset(col,0,sizeof col);
        memset(row,0,sizeof row);
        memset(grid,0,sizeof grid);
        sum = 0;
        for(int i = 0;i < N;i ++){ 
   
            col[i] = (1 << N) - 1;
            row[i] = (1 << N) - 1;
            grid[i / 3][i % 3] = (1 << N) - 1;
        }
        for(int i = 0;i < N;i ++){ 
   
            for(int j = 0;j < N;j ++){ 
   
                if(g[i][j] != '.'){ 
   
                    int x = g[i][j] - '1';
                    col[j] -= (1 << x);
                    row[i] -= (1 << x);
                    grid[i / 3][j / 3] -= (1 << x);
                }else sum ++;
            }
        }
        dfs(0);
    }
    return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/168847.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • activiti工作流开发_flowable工作流

    activiti工作流开发_flowable工作流深入理解Activiti工作流Activiti作为一个流行的开源工作流引擎,正在不断发展,其6.0版本以API形式提供服务,而之前版本基本都是要求我们的应用以JDK方式与其交互,只能将其携带到我们的应用中,而API方式则可以服务器独立运行方式,能够形成一个专网内工作流引擎资源共享的方式。Activiti执行的BPMN2.0,这个规范中有几个要素见下图:其实最经常使用的是开始结束事件和任务,本文就以…

    2022年10月6日
    6
  • 手机上编写Java程序的软件

    手机上编写Java程序的软件对于程序员来说,编写代码几乎都是在电脑上,但有时候在一些特殊情况下,没有电脑,或者不方便带电脑,这时就想,要是能在手机上写代码该多好啊。以前我也折腾过,找过许多软件,但感觉不如我意;但我并没有放弃,在浏览YouTube的时候,偶然发现了一款软件,好奇的我就下载来试了试,还真是好用,功能挺齐全的。下面就给大家推荐一下。Android系统由于本人用的是Android手机,就主要讲讲在Android…

    2022年6月9日
    35
  • pycharm虚拟环境与本地环境区别_pycharm自带python吗

    pycharm虚拟环境与本地环境区别_pycharm自带python吗    Python的版本众多,在加上适用不同版本的PythonPackage。这导致在同时进行几个项目时,对库的依赖存在很大的问题。这个时候就牵涉到对Python以及依赖库的版本管理,方便进行开发,virtualenv就是用来解决这个问题的。下面介绍使用PyCharm创建VirtualEnvironment的方法。    PyCharm可以使用virtualenv中的功能来创建虚拟环境。Py…

    2022年8月27日
    5
  • 基于HTML5移动app开发教程一

    基于HTML5移动app开发教程一一摘要现在教大家创建第一个移动APP应用,在这里不需要大家对HTML相关知识特别熟练,只要大家能看懂html,js代码,就可以轻松创建一个基于HTML5webAPP应用.二整体效果三整个框架图四具体实现1.页面引导图第一步manifest.json参数设置如图:第二步在index.html(这个文件相当于iOS中的appdelegate.m)加上引导图代码第三步在mui.plu

    2022年5月6日
    80
  • web默认端口号是多少_web网站的默认端口为

    web默认端口号是多少_web网站的默认端口为代理服务器常用端口计算机端口号范围1~65535,端口不能重复HTTP协议代理服务器常用端口号:80/8080/3128/8081/9080SOCKS代理协议服务器常用端口号:1080FTP(文件传输)协议代理服务器常用端口号:21Telnet(远程登录)协议代理服务器常用端口:23常用端口说明端口:21服务:FTP说明:FTP服务器所开放的端口,用于上传、下载。…

    2022年9月17日
    4
  • 虚拟机与宿主机网络[通俗易懂]

    虚拟机与宿主机网络[通俗易懂]桥接、NAT和host-only三种网络连接方式的区别一、不同网络连接方式对网络网络影响简介:二、三种网络连接方式详细介绍:我本机宿主机使用win10系统,IP地址为:192.168.1.117。1、桥接方式桥接方式下,虚拟机和宿主机处于同一网段,真实存在于网络中,像是一台真实的主机。虚拟机和宿主机彼此互通,且网络中的其他主机也可以互通。就像是连接在hub中的主机一样。获取的IP地址网段为:192.168.1.X,实际获取的为192.168.1.220。优点:可以轻松实现上网,同网段中的主机

    2022年8月21日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号