C语言回溯法九宫格数独问题
Problem H
数独游戏
时限:1000ms 内存限制:10000K 总时限:3000ms
描述:
数独游戏规则
在9阶方阵中,包含了81个小格(九列九行),其中又再分成九个小正方形(称为宫),每宫有九小格。
游戏刚开始时,盘面上有些小格已经填了数字(称为初盘),游戏者要在空白的小格中填入1到9的数字,
使得最后每行、每列、每宫都不出现重复的数字,而且每一个游戏都只有一个唯一的解答(称为终盘)。
输入:
一个9*9的矩阵,0表示该位置是空白。
输出:
一个9*9的矩阵,格式与输入类似。
输入样例:
900050060 020070100 300102040 703800529 000345000 516009403 050208006 007090010 030010004
输出样例:
971453268 428976135 365182947 743861529 892345671 516729483 154238796 687594312 239617854 #include<stdio.h> #include<string.h> int a[9][9]; void search(int n); int canplace(int n,int i); void output(); int main() { char b[9][10]; int q,j; for(q=0;q<9;q++) { for(j=0;j<=9;j++)//由于输入数据之间不含空格,所以只能用字符串存起来再转换成整型数组 { scanf("%c",&b[q][j]); if(b[q][j]!='\n')//换行时字符串会自动读取换行符,所以应该考虑到这种情况 a[q][j]=b[q][j]-'0';//字符型数组转换成整型数组 } } search(0);//回溯法求解 return 0; } void search(int n) { int i; if(n==81)output(); else if(a[n/9][n%9]!=0)search(n+1);若该位置上已有数字,则跳转至下一个位置 else if(a[n/9][n%9]==0) { for(i=1;i<=9;i++) { if(canplace(n,i))//判断该位置上能否放置数字i,若可以为其赋值,跳转至下一位置 { a[n/9][n%9]=i; search(n+1); } a[n/9][n%9]=0;若若找不到可以满足条件的数放置在该位置,还原它本来的值,回溯寻找下一组可能的解,每次调用完之后都需要让它返回与原来的值 } } } int canplace(int n,int i) { int j,k,flag=1; for(j=0;j<=8;j++)//判断该列上是否有该数字 { if(a[n/9][j]==i) { flag=0; break; } } if(flag==1) { for(j=0;j<=8;j++)判断该行是否有该数字 { if(a[j][n%9]==i) { flag=0; break; } } } if(flag==1)//判断其所在的小九宫格里是否有该数字 { for(j=(n/9/3)*3;j<(n/9/3)*3+3;j++) { for(k=(n%9/3)*3;k<(n%9/3)*3+3;k++) { if(a[j][k]==i) { flag=0; break; } if(flag==0)break; } } } return flag; } void output()//输出数组 { int i,j; for(i=0;i<9;i++) { for(j=0;j<9;j++) { printf("%d",a[i][j]); } printf("\n"); } }
C语言回溯法九宫格数独问题相关推荐
- 【算法分析】回溯法解数独(九宫格)算法
这篇文章,是来详细介绍怎样写出一个算法,来解出所有的数独问题.算法的程序运行时间,缩减在了毫秒级别.等到这篇文章结束,我会抽时间写一篇文章,介绍如何生成一个随机的唯一解的数独问题.另外,为了做图形方便 ...
- 回溯法求解数独问题(最简单,通俗易懂,附C++代码)
问题描述:数独是一种运用纸.笔进行演算的逻辑游戏.玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个九宫格内的数字均含1-9,不重复 要求:设计算法随机生成不同 ...
- python数独伪代码回溯法_数独的暴力回溯解法和Python GUI
数独起源于18世纪初瑞士数学家欧拉等人研究的拉丁方阵,20世纪70年代,经过美国及日本学者的推广和改良,定名为数独(Sudoku),大致的意思是"独个的数字"或"只出现一 ...
- 回溯算法背包问题迭代c语言,回溯法解决0_1背包问题(迭代和递归)
问题:0/1背包问题 例子:weight数组代表物品重量,value数组代表物品价值,M代表背包容量.背包是按单位价值递减的顺序排列的,即value[i]/weight[i]>value[i-1 ...
- c语言回溯法,回溯法 实现 排列组合(C 语言版本)
* 所谓回溯:就是搜索一棵状态树的过程,这个过程类似于图的深度优先 * 搜索(DFS),在搜索的每一步(这里的每一步对应搜索树的第i层)中 * 产生一个正确的解,然后在以后的每一步搜索过程中,都检查其 ...
- 用代码证明自己闲的蛋疼(三)——回溯法做数独
数独大家应该都玩过,1~9数字,满足每一行.每一列.每一个粗线宫(3*3)内的数字均含1-9,不重复. 起始会有一些给定的值,然后我们去填剩余的数,一个合理的数独最终解一定是唯一的. 九日哥也很喜欢玩 ...
- python数独伪代码回溯法_数独 #回溯算法 #CTF
1. intro:巅峰极客的一道逆向 刷巅峰极客2020里的rev题fu!kpy,复杂得不行但是看到if d[1][0] != '8' or d[1][7] != '2'和if check(h1) ! ...
- 递归回溯法求数独全部解
项目介绍 QT5做的数独求解程序,可以判断数独解的个数(如果非唯一解). 运行截图 源码说明 使用MSVC + QT5平台,故* .cpp和* .h文件均采用UTF8 + BOM编码.如果切换到Min ...
- N皇后问题(C语言)—回溯法
一.问题描述 问题描述:在N×N格的国际象棋上摆放N个皇后,使其不能互相攻击,即不能处于同一列或同一行,也不能处在同一斜线上,请问有多少种摆法? 不能放皇后的位置及位置之间的关系: 二.代码实现 #i ...
最新文章
- Py之scikit-learn:机器学习Sklearn库的简介、安装、使用方法(ML算法如何选择)、代码实现之详细攻略
- CF思维联系– Codeforces-988C Equal Sums (哈希)
- seo自动发外链_一套节约成本全网营销方案-小小课堂SEO培训教程
- springboot整合canal
- 算法的基本控制结构之循环结构
- Python decorator
- linux内核mtd驱动程序与sd卡驱动程序,Linux内核MTD驱动程序与SD卡驱动程序(2)
- 删除一个带有文件的文件夹
- linux中config文件怎么打开,linux-如何使用CoreOS的cloud-config文件启动Dock...
- Python之计算机算法基础总结(借鉴、整理)、排序算法、查找算法
- word内容被锁定无法进行修改的解决办法
- Web前端大作业—— 饮食餐饮网站 咖啡网站pc端带轮播(5个页面)HTML+CSS+JavaScript 学生美食网页设计作品 学生餐饮文化网页模板
- 如何帮银行保持长期竞争力?融360天机公布独家秘诀
- 百度地图LV1.5实践项目开发工具类bmap.util.jsV1.3
- 简述计算机动画制作流程,Mg动画制作流程——六大步骤
- 数学建模:整数规划—指派模型与匈牙利算法
- 旧金山大学的算法可视化学习教程 赞的教程,将抽象的算法可视化,易于理解
- ZJOI2016一点也不好玩啊
- 阿里云OSS PicGo 配置图床教程 超详细
- 魔兽世界经典怀旧服务器架设教程