本题目包括两个步骤:(1)数独题目生成 generator.py;(2)数独题目 自动求解 solve.py 1. 数独题目生成(请严格按照命令行参数实现-N, -H, -o 等,下同): python generator.py -N 9 -H 10 -S 1 -o x.txt python generator.py -N 16 -H 10 -S 1 -o x.xlsx 说明:参数 N 取 4,9,16,表示整个数独是多少行列,参数 H 表示题目中 空洞数,若 H 过大,导致数独谜题无唯一答案,则给出保证此谜题唯一答 案的最大空洞数情形即可;参数-S 表示一次生成多少个不同的数独, 参数 o 指定文件输出(支持 txt 和 excel,根据文件后缀决定, 数独谜题空洞处填 0. 2. 自动求解数独 python solve.py -i x.txt -s 1 python solve.py -i x.xlsx -s 1 说明:从文件读入,x.txt 或 x.xlsx,结果显示在屏幕上;-i 表示输入文件 名,-s 表示读入文件中第几个数独(从 1 开始计数) 其他:(1)鼓励自由发挥提供图形界面;(2)上述数独题目生成和自动求解数独中,默认是生成 1 个题目,文件中也默认存储 1 个题目。帮我写出这一道题目符合条件的两个代码,并在重要代码后添上中文注释
时间: 2023-03-09 07:43:52 浏览: 79
python generator.py -N 9 -H 10 -S 1 -o x.txt # 生成9*9数独,题目中空洞数最多为10,一次生成1个不同的数独,输出文件为x.txtpython solve.py -i x.txt -s 1 # 从文件x.txt读入,解第1个数独,结果显示在屏幕上
相关问题
java生成数独题目
生成数独题目的方法可以通过编程语言Java来实现。为了生成一个合法的数独题目,需要确保以下条件:
1. 没有重复的数字出现在每一行、每一列和每一个3x3的九宫格中;
2. 开始时,数独题目中预填的数字(已知的数字)应该保证唯一性;
3. 生成的数独题目应该有唯一解。
首先,可以创建一个9x9的二维数组,用于表示数独的九宫格。然后,通过递归的方式填充九宫格。
具体实现可以按照以下步骤进行:
1. 创建一个递归函数 `solveSudoku()`,用于填充九宫格中的数字;
2. 在递归函数中,首先判断数独题目是否已经填充完毕(即所有的空格都已经填入数字),如果是则返回 true;
3. 遍历九宫格中的空格,找到第一个没有数字的格子;
4. 对该格子尝试填入数字 1-9,判断是否合法(即是否满足数独的要求);
5. 如果填入的数字合法,则递归调用 `solveSudoku()` 函数继续填充下一个格子;
6. 如果填入的数字不合法,则尝试下一个数字,直到找到合法的数字或者遍历完所有数字;
7. 如果所有数字都尝试过,都不合法,则返回 false,同时回溯到上一个格子;
8. 当递归函数返回 true 时,表示已经成功填充了所有的格子,并且生成了一个合法的数独题目。
通过以上的步骤,就可以使用Java来生成一个合法的数独题目。具体的代码可以根据上述思路进行编写。
用matlab语言解决此类问题题目 1:数独游戏设计 (1) 根据数独游戏规则,设计数独判断程序; (2) 自动生成数独表; (3) 根据输入给出输出
好的,使用MATLAB语言实现数独游戏设计。
1. 数独判断程序的设计
以下是一个MATLAB函数,用于检查数独表格是否符合规则:
```matlab
function valid = checkSudoku(sudoku)
% 检查每一行是否符合规则
for i = 1:9
row = sudoku(i,:);
if length(unique(row)) ~= 9
valid = false;
return;
end
end
% 检查每一列是否符合规则
for i = 1:9
col = sudoku(:,i);
if length(unique(col)) ~= 9
valid = false;
return;
end
end
% 检查每一个宫是否符合规则
for i = 1:3:7
for j = 1:3:7
block = sudoku(i:i+2,j:j+2);
if length(unique(block(:))) ~= 9
valid = false;
return;
end
end
end
valid = true;
end
```
该函数接受一个9x9的数独表格作为输入,返回一个布尔值,表示数独表格是否符合规则。该函数通过遍历每一行、每一列和每一个宫来检查数字是否重复,并使用unique函数来判断是否有重复数字。
2. 自动生成数独表
以下是一个MATLAB函数,用于自动生成数独表:
```matlab
function sudoku = generateSudoku()
sudoku = zeros(9);
rows = 1:9;
cols = 1:9;
% 随机填充数独表格
for i = 1:9
% 随机选择一行和一列
row = rows(randi(length(rows)));
col = cols(randi(length(cols)));
% 获取可用的数字
nums = getPossibleNumbers(sudoku,row,col);
% 随机选择一个数字填入数独表格
sudoku(row,col) = nums(randi(length(nums)));
% 从可用的行列中删除已经填入数字的行列
rows(sudoku(row,:)~=0) = [];
cols(sudoku(:,col)~=0) = [];
end
end
function nums = getPossibleNumbers(sudoku,row,col)
% 获取可用的数字
nums = 1:9;
% 删除与该位置所在行列宫内已经出现的数字
nums(sudoku(row,:)~=0) = [];
nums(sudoku(:,col)~=0) = [];
block = sudoku(3*floor((row-1)/3)+1:3*floor((row-1)/3)+3,3*floor((col-1)/3)+1:3*floor((col-1)/3)+3);
nums(block~=0) = [];
end
```
该函数使用随机算法来生成数独表。首先随机选择一个位置,然后从1到9中随机选择一个数字填入该位置,然后删除该行、该列和该宫内已经出现的数字。重复这个过程,直到数独表格填满为止。
3. 根据输入给出输出
以下是一个MATLAB函数,用于根据输入给出输出:
```matlab
function output = solveSudoku(input)
% 输入为不完整的数独表格
if sum(input(:)==0) > 0
% 递归解决
sudoku = input;
[row,col] = find(sudoku==0,1);
nums = getPossibleNumbers(sudoku,row,col);
for i = 1:length(nums)
sudoku(row,col) = nums(i);
if checkSudoku(sudoku)
output = solveSudoku(sudoku);
if ~isempty(output)
return;
end
end
sudoku(row,col) = 0;
end
output = [];
% 输入为完整的数独表格
else
if checkSudoku(input)
output = input;
else
output = [];
end
end
end
```
该函数接受一个9x9的数独表格作为输入,返回一个9x9的数独表格作为输出。如果输入为不完整的数独表格,则使用递归算法来填充空白格子,直到数独表格完整为止。如果输入为完整的数独表格,则使用checkSudoku函数来检查数独表格是否符合规则。