抽象DFS: 数独

简介: 抽象DFS: 数独

蒜头君今天突然开始还念童年了,想回忆回忆童年。他记得自己小时候,有一个很火的游戏叫做数独。便开始来了一局紧张而又刺激的高阶数独。蒜头君做完发现没有正解,不知道对不对? 不知道聪明的你能否给出一个标准答案?


标准数独是由一个给与了提示数字的 9×9 网格组成,我们只需将其空格填上数字,使得每一行,每一列以及每一个 3×3 宫都没有重复的数字出现。

输入:


* 2 6 * * * * * *


* * * 5 * 2 * * 4


* * * 1 * * * * 7


* 3 * * 2 * 1 8 *


* * * 3 * 9 * * *


* 5 4 * 1 * * 7 *


5 * * * * 1 * * *


6 * * 9 * 7 * * *


* * * * * * 7 5 *


输出:


1 2 6 7 3 4 5 9 8


3 7 8 5 9 2 6 1 4


4 9 5 1 6 8 2 3 7


7 3 9 4 2 5 1 8 6


8 6 1 3 7 9 4 2 5


2 5 4 8 1 6 3 7 9


5 4 7 2 8 1 9 6 3


6 1 3 9 5 7 8 4 2


9 8 2 6 4 3 7 5 1

#include <iostream>
using namespace std;
char a[10][10];
bool f;
bool hang[10][10],lie[10][10],ge[10][10];
void dfs(int x,int y){
  if(f){                         //f在这里意思是,已经找到解,无需继续搜素(剪枝)
    return;
  }
  if(x==9){
    f=true;
    cout<<"--------------------"<<endl;
    for(int i=0;i<9;i++){
      for(int j=0;j<9;j++){
        if(j!=8){
          cout<<a[i][j]<<' ';
        }else{
          cout<<a[i][j]<<endl;
        }
    }
  }
  return;
}
  if(y==9){                           //y=9时进入下一行
    dfs(x+1,0);
    return;
  }
  if(a[x][y]!='*'){                   //x行y列是数字无需进行判断
    dfs(x,y+1);
    return;
  }
  for(int i=1;i<=9;i++){
    if(!hang[x][i] && !lie[y][i] && !ge[(x/3)*3+y/3][i]){
      a[x][y]='0'+i;
      hang[x][i]=true;
      lie[y][i]=true;
      ge[(x/3)*3+y/3][i]=true;
      dfs(x,y+1);
      hang[x][i]=false;
      lie[y][i]=false;
      ge[(x/3)*3+y/3][i]=false;
      a[x][y]='*'; 
    }
  } 
}
int main(){
  for(int i=0;i<9;i++){
    for(int j=0;j<9;j++){
      cin>>a[i][j];
    }
  }
  for(int i=0;i<9;i++){
    for(int j=0;j<9;j++){
      if(a[i][j]!='*'){
        hang[i][a[i][j]-'0']=true;   //第i行,a[i][j]不可用 
        lie[j][a[i][j]-'0']=true;    //第j列,a[i][j]不可用 
        ge[(i/3)*3+j/3][a[i][j]-'0']=true;  //自上向下,自左向右,分为9个格。 
      }
    }
  }
  dfs(0,0);             //c从0行0列开始搜索 
  return 0;
}

相关文章
|
JSON JavaScript 前端开发
js树形菜单 如何用递归制作一个简单的树形菜单
js树形菜单 如何用递归制作一个简单的树形菜单
256 0
|
7月前
|
安全 5G 网络安全
RDP:你的远程办公"任意门"使用说明书(附防黑客秘籍)
本文趣味讲解远程桌面协议(RDP)的前世今生,从1998年诞生到如今支持4K高清的Win11版本,带你了解其技术进化。文章剖析RDP工作原理,如数据加密传输、省流模式等,并警示安全风险,提供防护建议。此外,还对比了SSH、VNC等协议特点,展望RDP在量子计算与5G时代的未来,提醒用户平衡虚拟与现实生活。内容轻松幽默,适合各路“社畜”与技术爱好者阅读。
459 2
|
资源调度 分布式计算 安全
伏羲—阿里云分布式调度系统
在12月12日的云栖社区在线培训上,“飞天”分布式系统核心开发人员陶阳宇分享了《伏羲-阿里云分布式调度系统》。他主要从伏羲系统架构、任务调度、资源调度、容错机制、规模挑战、安全与性能隔离方面介绍了伏羲分布式系统架构和设计理念。
23049 0
|
JavaScript 前端开发
|
6月前
|
JavaScript 前端开发 编译器
Vue与TypeScript:如何实现更强大的前端开发
Vue.js 以其简洁的语法和灵活的架构在前端开发中广受欢迎,而 TypeScript 作为一种静态类型语言,为 JavaScript 提供了强大的类型系统和编译时检查。将 Vue.js 与 TypeScript 结合使用,不仅可以提升代码的可维护性和可扩展性,还能减少运行时错误,提高开发效率。本文将介绍如何在 Vue.js 项目中使用 TypeScript,并通过一些代码示例展示其强大功能。
281 22
|
8月前
|
数据采集 安全 算法
315曝光“精准获客”黑色产业链,WoSign SSL证书助您守护数据安全
315晚会揭露了隐私窃取黑幕,一些公司滥用网络爬虫技术和未加密数据传输,非法获取用户信息。事件凸显数据安全的重要性,HTTPS加密(如SSL/TLS)可保护数据传输安全,确保信息不被窃取或篡改。阿里云WoSign SSL证书提供可靠解决方案,助力政企防范风险,保障用户隐私与数据安全,推动数字化时代健康发展。
454 3
315曝光“精准获客”黑色产业链,WoSign SSL证书助您守护数据安全
|
8月前
|
机器学习/深度学习 存储 算法
基于MobileNet深度学习网络的活体人脸识别检测算法matlab仿真
本内容主要介绍一种基于MobileNet深度学习网络的活体人脸识别检测技术及MQAM调制类型识别方法。完整程序运行效果无水印,需使用Matlab2022a版本。核心代码包含详细中文注释与操作视频。理论概述中提到,传统人脸识别易受非活体攻击影响,而MobileNet通过轻量化的深度可分离卷积结构,在保证准确性的同时提升检测效率。活体人脸与非活体在纹理和光照上存在显著差异,MobileNet可有效提取人脸高级特征,为无线通信领域提供先进的调制类型识别方案。
windbg分析 IRQL_NOT_LESS_OR_EQUAL 蓝屏问题
本文通过windbg分析了电脑出现的IRQL_NOT_LESS_OR_EQUAL蓝屏问题,并尝试了多种解决方法,最终通过硬件清理暂时解决了问题。
835 0
windbg分析 IRQL_NOT_LESS_OR_EQUAL 蓝屏问题
|
JavaScript 前端开发
JavaScript 与 HTML 的结合
JavaScript 与 HTML 的结合
142 0
|
存储 Kubernetes Cloud Native
浅谈etcd服务注册与发现
浅谈etcd服务注册与发现
715 0

热门文章

最新文章