数独

P1074 靶形数独(爆搜)

柔情痞子 提交于 2019-11-30 06:30:26
说是爆搜,却还是有点技巧 首先数独应该有个想法,从最有可能填上数字的那些地方开始 也就是说哪些行0最少,就从那儿开始 为了最大限度地利用已有信息,就先把所有0的位置扣出来单独填 最后别忘了回溯就行 但是这种做法仍然过不了下面这个样例: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 还是应该学学DLX,此外用拼音做数组名实在太爽了 代码: #include <bits/stdc++.h> #define int long long #define sc(a) scanf("%lld",&a) #define scc(a,b) scanf("%lld %lld",&a,&b) #define sccc(a,b,c) scanf("%lld %lld %lld",&a,&b,&c) #define scs(a) scanf("%s",a) #define schar(a) scanf("%c",&a) #define pr(a) printf("%lld",a) #define fo(i,a,b) for(int

Acwing-169-数独2(搜索, 剪枝)

删除回忆录丶 提交于 2019-11-30 03:34:18
链接: https://www.acwing.com/problem/content/171/ 题意: 请你将一个16x16的数独填写完整,使得每行、每列、每个4x4十六宫格内字母A~P均恰好出现一次。 保证每个输入只有唯一解决方案。 思路: 每个坐标维护一个16位的数, 用来记录某个值是否使用. 对每个位置, 如果只能填一个,则直接填, 对空格如果不能填, 则返回. 对每一行, 只能在一个位置使用的值直接填, 同时一行不能覆盖a-p,则返回, 列, 块同理. 再从所有可行位置,找到一个可填值最少的开始枚举. 还要多开数组记录状态, 方便复原. 代码: #include <bits/stdc++.h> using namespace std; const int N = 16; char Map[N][N+1]; char TmpMap[N*N+1][N][N+1]; int State[N][N]; int TmpS1[N*N+1][N][N], TmpS2[N*N+1][N][N]; int Num[1<<N], Cnt[1<<N]; int cnt; int Lowbit(int x) { return x&(-x); } void Change(int x, int y, int p) { Map[x][y] = 'A'+p; for (int i = 0;i < N;i+

Linux命令之nohup 和 重定向

天大地大妈咪最大 提交于 2019-11-30 03:08:58
每周一个 Algorithm,Review 一篇英文文章,总结一个工作中的技术 Tip,以及 Share 一个传递价值观的东西! Algorithm: 学习算法 题目:valid-sudoku(有效的数独) 描述:判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 上图是一个部分填充的有效的数独。 数独部分空格内已填入了数字,空白格用 '.' 表示。 示例 1: 输入: [ ["5","3",".",".","7",".",".",".","."], ["6",".",".","1","9","5",".",".","."], [".","9","8",".",".",".",".","6","."], ["8",".",".",".","6",".",".",".","3"], ["4",".",".","8",".","3",".",".","1"], ["7",".",".",".","2",".",".",".","6"], [".","6",".",".",".",".","2","8","."], [".",".",".","4","1","9",".",".","5"], [".",".","

Acwing-166-数独(搜索)

有些话、适合烂在心里 提交于 2019-11-29 21:05:28
链接: https://www.acwing.com/problem/content/168/ 题意: 数独是一种传统益智游戏,你需要把一个9 × 9的数独补充完整,使得图中每行、每列、每个3 × 3的九宫格内数字1~9均恰好出现一次。 请编写一个程序填写数独。 思路: 二进制记录每一行, 每一列, 每一块的数值使用情况, 每次从最小的开始枚举. 代码: #include <bits/stdc++.h> using namespace std; char input[90]; char Map[10][10]; int Cnt[1000], Num[1000]; int row[10], col[10], gri[10]; int cnt; int Lowbit(int x) { return x&(-x); } int GetP(int x, int y) { return (x/3)*3+(y/3); } void Change(int x, int y, int p) { row[x] ^= (1<<p); col[y] ^= (1<<p); gri[GetP(x, y)] ^= (1<<p); } bool Dfs(int las) { // cout << las << endl; if (las == 0) return true; int tmp = 10, x, y

leetcode第36题:有效的数独

佐手、 提交于 2019-11-29 08:32:42
解题思路:按行,列,3*3方格读取元素,存入字典中。若字典中该元素的值大于1,则返回false,否则返回true。 class Solution: def isValidSudoku(self, board: List[List[str]]) -> bool: rows = [{} for i in range(9)] column = [{} for i in range(9)] box = [{} for i in range(9)] for i in range(9): for j in range(9): # 读取元素 nums = board[i][j] # 计算3*3方格的下标 index = (i //3) *3 + j//3 if nums!='.': # 字典的get() 如果nums元素没有,则生成并赋值为0,然后对值加1 rows[i][nums] = rows[i].get(nums,0)+1 column[j][nums] = column[j].get(nums,0)+1 box[index][nums] = box[index].get(nums,0)+1 if rows[i][nums]>1 or column[j][nums]>1 or box[index][nums]>1: return False return True 难点: 1.

Squiggly Sudoku HDU - 4069

≯℡__Kan透↙ 提交于 2019-11-29 02:22:06
Today we play a squiggly sudoku , The objective is to fill a 9*9 grid with digits so that each column, each row, and each of the nine Connecting-sub-grids that compose the grid contains all of the digits from 1 to 9. Left figure is the puzzle and right figure is one solution. Now, give you the information of the puzzle, please tell me is there no solution or multiple solution or one solution. InputThe first line is a number T(1<=T<=2500), represents the number of case. The next T blocks follow each indicates a case. Each case contains nine lines, Each line contains nine integers. Each module

sudoku_solve数独算法

十年热恋 提交于 2019-11-28 09:53:26
数独规则 首先看一下数独 数独的规则比较简单: 每一行包括了1到9的数字,并且不能重复。 每一列包括了1到9的数字,并且不能重复。 每一组包括了1到9的数字,并且不能重复。 数独题的基本要求: 数独题的要求为数独要有唯一解,表现在: 已填满的空格不能与它所在的行、列、组重合。 采用遍历的方式能够找到数独的解,并且解是唯一的。 生成数独题的步骤和流程图 步骤 步骤一、生成一个所有单元都是空的空数独 步骤二、随机选择一个空单元,找到它的所有可能解 步骤三、遍历空单元的每个可能解。将每个解填入,求的填入后数独的解的个数。 步骤四、如果有可能解的填入之后数独解个数为1,则此填入此可能解之后的数独即为生成的数独,否则,随机选择一个可能解,进行步骤二。 代码 #include<iostream> using namespace std; ///N=9; int n = 9; bool isPossible(int mat[][9], int i, int j, int no){ ///Row or col nahin hona chahiye for (int x = 0; x<n; x++){ if (mat[x][j] == no || mat[i][x] == no){ return false; } } /// Subgrid mein nahi hona chahiye int sx

Leetcode-剪枝

生来就可爱ヽ(ⅴ<●) 提交于 2019-11-27 12:31:22
51. N皇后 https://leetcode-cn.com/problems/n-queens/ n 皇后问题研究的是如何将 n 个皇后放置在 n × n 的棋盘上,并且使皇后彼此之间不能相互攻击。 给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。 每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。 解: dfs + 剪枝,枚举每个行。注意在做回溯之前,要把当前放置的皇后拿掉,把其造成影响的标识位都消除。 class Solution: def solveNQueens(self, n: int) -> List[List[str]]: def could_place(row, col): # row这一行是没有放置过的行,要检查col这一列、(row,col)所占两条对角线有没有被放置过,如果都没有,(row,col)可以放皇后 return not (cols[col]+hill_diagonals[row-col]+\ dale_diagonals[row+col]) def place_queen(row, col): queens.add((row, col)) # 放皇后,记录位置,标记列和两对角线 cols[col] = 1 hill_diagonals[row-col] = 1 dale

舞蹈链---精确覆盖,解决数独问题

耗尽温柔 提交于 2019-11-27 08:31:37
首先看看数独问题(9*9的方格)的规则 1、每个格子只能填一个数字 2、每行每个数字只能填一遍 3、每列每个数字只能填一遍 4、每宫每个数字只能填一遍 那现在就是利用这个规则把数独问题转换为精确覆盖问题 可是,直观上面的规则,发现比较难以转换为精确覆盖问题。因此,把上面的表述换个说法 1、每个格子只能填一个数字 2、每行1-9的这9个数字都得填一遍(也就意味着每个数字只能填一遍) 3、每列1-9的这9个数字都得填一遍 4、每宫1-9的这9个数字都得填一遍 构建矩阵: 第1列定义成:(1,1)填了一个数字 第2列定义成:(1,2)填了一个数字 …… 第9列定义成:(1,9)填了一个数字 第10列定义成:(2,1)填了一个数字 …… 第18列定义成:(2,9)填了一个数字 …… 第81列定义成:(9,9)填了一个数字 至此,用第1-81列完成了 约束条件1:每个格子只能填一个数字 第82列定义成:在第1行填了数字1 第83列定义成:在第1行填了数字2 …… 第90列定义成:在第1行填了数字9 第91列定义成:在第2行填了数字1 …… 第99列定义成:在第2行填了数字9 …… 第162列定义成:在第9行填了数字9 至此,用第82-162列(共81列)完成了 约束条件2:每行1-9的这9个数字都得填一遍 第163列定义成:在第1列填了数字1 第164列定义成:在第1列填了数字2 ……

旁友数独会伐啦?python秒解数独了解下伐啦?

99封情书 提交于 2019-11-25 16:56:15
前几天和隔壁邻居玩斗地主被发现了,牌被没收了,斗地主是斗不了了,但我还想和邻居玩耍。如果你还想斗斗地主,戳: 趁老王不在,和隔壁邻居斗斗地主,比比大小 想破脑袋终于让我想到一个游戏,数独!什么叫数独?数独就是可以让我趁老王不在的时候和隔壁邻居一起玩耍的游戏! 数独的规则 1、数字 1-9 在每一行只能出现一次。 2、数字 1-9 在每一列只能出现一次。 3、数字 1-9 在每一个 3x3 宫内只能出现一次。3x3 的宫内为A1-C3,A4-C6,A7-C9,D1-F3,D4-F6,D7-F9... 数独题目示例 大致思路 1、数独我们使用一个二维列表存储,没有值的位置我们使用''空字符窜占位。(二维数组) 2、得到每一个3*3的宫内,每一行,每一列已有的数据,然后存放起来。3、得到所有的空缺位置,再遍历空缺位置,尝试放置数据,然后进行判断,如果满足条件安继续放置下一个。以此类推,在途中有不满足条件的情况,就进行回溯,返回上一次满足条件的情况,在进行另一次尝试。 演示环境 操作系统:windows10 python版本:python 3.7 代码编辑器:pycharm 2018.2 具体代码 1、首选我们创建一个类 SudoKu 。编写构造函数。 class SudoKu(): def __init__(self,sudo_ku_data): # 判断传入的数独是否满足格式 if