数独

数独

核能气质少年 提交于 2019-12-03 11:38:29
  这两天一直在研究数独,但是并没有研究透彻,由于时间的原因,暂时研究终止。期间一共写出了一个大方法,一个小方法。小方法还待优化。 注意一点:输入数据后,先执行一次"up"命令,更新一下每个棋盘格的可选数字,才可执行"m1"或"m2"的操作。 代码就如下所示: class shuDu: # 一道待解决的数独题 cBoard =[ [6,0,0,0,0,0,5,8,0], [5,2,0,9,0,0,6,0,0], [0,0,0,0,5,0,0,0,3], [2,0,0,8,3,0,0,0,0], [0,0,6,1,0,9,3,0,0], [0,0,0,0,7,6,0,0,9], [8,0,0,0,4,0,0,0,0], [0,0,2,0,0,5,0,1,7], [0,6,1,0,0,0,0,0,4] ] check = {} #可用数字字典 def refresh(self): print(self.cBoard) print("Refresh over") def show(self): print("==========================") for i in range(0,9): for j in range(0,9): num = ['-','-','-','-','-','-','-','-','-'] if((i,j) in self.check):

【NOIP 2009】 靶形数独

匿名 (未验证) 提交于 2019-12-03 00:40:02
【题目链接】 【算法】 【代码】 #include<bits/stdc++.h> using namespace std; const int INF = 2e9; struct point { int x,y; } a[ 100 ]; int i,j,ans,n,Mask,t; int val[ 9 ][ 9 ]; int w[ 2000 ],num[ 2000 ]; bool used[ 100 ]; int row[ 10 ],col[ 10 ],grid[ 10 ]; bool solved; const int s[ 9 ][ 9 ] = { { 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 }, { 6 , 7 , 7 , 7 , 7 , 7 , 7 , 7 , 6 }, { 6 , 7 , 8 , 8 , 8 , 8 , 8 , 7 , 6 }, { 6 , 7 , 8 , 9 , 9 , 9 , 8 , 7 , 6 }, { 6 , 7 , 8 , 9 , 10 , 9 , 8 , 7 , 6 }, { 6 , 7 , 8 , 9 , 9 , 9 , 8 , 7 , 6 }, { 6 , 7 , 8 , 8 , 8 , 8 , 8 , 7 , 6 }, { 6 , 7 , 7 , 7 , 7 , 7 , 7 , 7 , 6 }, { 6 , 6

luogu P1074 靶形数独

匿名 (未验证) 提交于 2019-12-03 00:33:02
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低。但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“靶形数独”,作为这两个孩子比试的题目。 9 9 9 3 3 1 9 10 1 9 8 7 6 总分数即每个方格上的分值和完成这个数独时填在相应格上的数字的乘积的总和。如图,在以下的这个已经填完数字的靶形数独游戏中,总分数为 2829。游戏规定,将以总分数的高低决出胜负。 由于求胜心切,小城找到了善于编程的你,让你帮他求出,对于给定的靶形数独,能够得到的最高分数。 输入输出格式 输入格式: 9 9 0-9 0 ? 0 输出格式: 1 -1 ? 输入输出样例 复制 7 0 0 9 0 0 0 0 1 1 0 0 0 0 5 9 0 0 0 0 0 2 0 0 0 8 0 0 0 5 0 2 0 0 0 3 0 0 0 0 0 0 6 4 8 4 1 3 0 0 0 0 0 0 0 0 7 0 0 2 0 9 0 2 0 1 0 6 0 8 0 4 0 8 0 5 0 4 0 1 2 复制 2829 复制 0 0 0 7 0 2 4 5 3 9 0 0 0 0 8 0 0 0 7 4 0 0 0 5 0 1 0 1 9 5 0 8 0 0 0 0 0 7 0 0 0 0 0 2 5 0 3 0

数独

匿名 (未验证) 提交于 2019-12-03 00:12:02
数独(shù dú)是源自18世纪瑞士的一种数学游戏。是一种运用纸、笔进行演算的 逻辑游戏 。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫(3*3)内的数字均含1-9,不重复 [1] 。 数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称“九宫格”。 来源:博客园 作者: 程来勇 链接:https://www.cnblogs.com/chenglaiyong/p/11605655.html

LeetCode训练36:有效的数独

匿名 (未验证) 提交于 2019-12-02 23:59:01
判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 上图是一个部分填充的有效的数独。 数独部分空格内已填入了数字,空白格用 '.' 表示。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/valid-sudoku 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 1. class Solution : def isValidSudoku ( self , board : List [ List [ str ]]) -> bool : remain = [] for i in range ( 9 ): remain . clear () for j in range ( 9 ): if board [ i ][ j ] == '.' : continue if board [ i ][ j ] not in remain : remain . append ( board [ i ][ j ]) else : return False for i in range ( 9 ): remain . clear () for j in

回溯法数独求解

匿名 (未验证) 提交于 2019-12-02 21:45:52
public class SoduTest { private int[][] sodu = { // 最难的 // {0,0,5,3,0,0,0,0,0}, // {8,0,0,0,0,0,0,2,0}, // {0,7,0,0,1,0,5,0,0}, // {4,0,0,0,0,5,3,0,0}, // {0,1,0,0,7,0,0,0,6}, // {0,0,3,2,0,0,0,8,0}, // {0,6,0,5,0,0,0,0,9}, // {0,0,4,0,0,0,0,3,0}, // {0,0,0,0,0,9,7,0,0} // 包含两个解的 {7,6,1,2,4,5,8,3,9}, {3,2,8,1,7,9,4,5,6}, {0,0,4,8,3,6,7,2,1}, {8,7,5,9,6,4,2,1,3}, {2,3,9,7,5,1,6,4,8}, {1,4,6,2,8,3,9,7,5}, {4,1,7,3,9,8,5,6,2}, {0,0,3,4,2,6,1,8,7}, {6,8,2,5,1,7,3,9,4} }; public static void main(String[] args) { long timeStart = System.currentTimeMillis(); new SoduTest().getSoduAnswer(0, 0); long

靶型数独

白昼怎懂夜的黑 提交于 2019-12-02 19:29:37
https://loj.ac/problem/2591 题目描述   给出数独的一部分,并且每个位置的有一定分数,数独的总分数等于所有位置上的数值乘以其分数,求最大分数 思路   首先直接爆搜肯定会 \(T\) 掉,我们就需要贪心的从一种较优解开始搜索。我采用的是一种较优的方法,先统计一遍每行已知的个数,然后在将行排序一遍,从已知数字最多的那一行逐列搜索,全部搜索完后统计答案即可。注意维护数独的各个信息就可以了。 代码 #include <bits/stdc++.h> using namespace std; int mp[10][10]; bool l[10][10],h[10][10],jg[10][10]; int ans; int v[15][15]={{},{0,6,6,6,6,6,6,6,6,6}, {0,6,7,7,7,7,7,7,7,6}, {0,6,7,8,8,8,8,8,7,6}, {0,6,7,8,9,9,9,8,7,6}, {0,6,7,8,9,10,9,8,7,6}, {0,6,7,8,9,9,9,8,7,6}, {0,6,7,8,8,8,8,8,7,6}, {0,6,7,7,7,7,7,7,7,6}, {0,6,6,6,6,6,6,6,6,6}}; bool f; struct Node { int l,sum; }ll[20]; int cmp

「NOIP2009」靶形数独

倾然丶 夕夏残阳落幕 提交于 2019-12-02 16:08:43
传送门 Luogu 解题思路 这题其实挺简单的。 首先要熟悉数独,我们应该要优先搜索限制条件多的行,也就是可能方案少的行,显然这样可以剪枝,然后再发挥一下dfs的基本功就可以了。 细节注意事项 爆搜题,你们都懂。。。 参考代码 #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <cctype> #include <cmath> #include <ctime> #define rg register using namespace std; template < typename T > inline void read(T& s) { s = 0; int f = 0; char c = getchar(); while (!isdigit(c)) f |= c == '-', c = getchar(); while (isdigit(c)) s = s * 10 + (c ^ 48), c = getchar(); s = f ? -s : s; } const int s[10][10] = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 6, 6, 6, 6, 6, 6, 6,

验证数独棋盘

时光怂恿深爱的人放手 提交于 2019-12-02 08:58:58
原题   Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules .   The Sudoku board could be partially filled, where empty cells are filled with the character '.' .      A partially filled sudoku which is valid.    Note:   A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated. 题目大意   验证一个数独棋盘是否合法,数独棋盘的验证规则见链接对应的页面。   数独棋盘是部分填满的,空的位置使用点来代替。    注意: 合法的棋盘不一定要求的可解的,只要填充的数字满足要求就可以。 解题思路   先对行进行检查,再对列进行检查,最后检查3*3的方格。 代码实现 算法 实现类 public class Solution { public boolean isValidSudoku(char[][] board) { // .的ASCII值是46,0的ASCII值是48,

数独完全解生成之分组轮转算法

微笑、不失礼 提交于 2019-12-02 05:01:01
数独(日语:数独すうどく)是一种源自18世纪末的瑞士,后在美国发展、并在日本得以发扬光大的数学智力拼图游戏。拼图是九宫格(即3格宽×3格高)的正方形状,每一格又细分为一个九宫格。在每一个小九宫格中,分别填上1至9的数字,让整个大九宫格每一列、每一行的数字都不重复。数独的玩法逻辑简单,数字排列方式千变万化。不少教育者认为数独是锻炼脑筋的好方法。 在数独出现之前,最流行的游戏有: 魔方 (Rubik'scubes)、 俄罗斯方块 (Tetris),甚至是 超级玛丽 (Mario)。但是这些都是风靡一时但又转瞬即逝的游戏。数独游戏的渊源比较久远,数独是一种源自18世纪末的瑞士,后在 美国 发展并在 日本 得以发扬光大的数学智力拼图游戏。 早在数千年前,中国人就发明了 九宫图 :在9个方格中,横行和竖行的数字总和是相同的。“数独”也不是什么新生事物,已经存在了数百年。18世纪, 瑞士 数学家莱昂哈德·欧勒发明了“拉丁方块”,但并没有受到人们的重视。直到20世纪70年代,美国杂志才以“ 数字拼图 ”的名称将它重新推出。日本随后接受并推广了这种游戏,并且将它改名为“数独”,大致的意思是“独个的数字”或“只出现一次的数字”。 现今流行的数独于 1984年 由日本游戏杂志《パズル通信ニコリ》发表并得了现时的名称。数独本是“独立的数字”的省略,因为每一个方格都填上一个非零的个位数