数独游戏代码C++解法
题目要求很简单 就是给一个6*6的数独输入 关于6 * 6的数独介绍:
玩数独你应该知道,每行/列数字不能重复,每个3*2的方格内不能重复,该题目是来自某公司的笔试题。采用C++算法进行求解。该代码也没有考虑无解的情况,和力扣上的一道类似。
1 2 3 4 5 6
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
求解出该输出
1 2 3 | 4 5 6
4 5 6 | 1 2 3
------|------
3 1 4 | 2 6 5
2 6 5 | 3 1 4
-------------
5 3 1 | 6 4 2
6 4 2 | 5 3 1
直接上代码通过暴力回溯直接 找到最佳值
#include <bits/stdc++.h>using namespace std;int m = 6; // 阶数
int boxRow = 2, boxCol = 3;
bool sudokuSolved = false;vector<vector<int> > rowOccupied(6, vector<int>(7));
vector<vector<int> > colOccupied(6, vector<int>(7));
vector<vector<int> > boxOccupied(6, vector<int>(7));
vector<vector<int> > shudoPan(m, vector<int>(m));void Initialize(vector<vector<int> > Occupied) {for(int i = 0; i < m; i++) {for(int k = 0; k < m+1; k++) {Occupied[i][k] = 0;}}
}bool couldPlace(int d, int row, int col) {//判断某格子是否可以放置if(boxRow > 0) {int idx = (row / boxRow ) * boxRow + col / boxCol;return rowOccupied[row][d] + colOccupied[col][d] + boxOccupied[idx][d] == 0;}else {return rowOccupied[row][d] + colOccupied[col][d] == 0;}}void backtrack(int row, int col) {if(shudoPan[row][col] == 0) {for(int d = 1; d <= m; d++) {int idx = 0;if(boxRow > 0) {idx = (row / boxRow ) * boxRow + col / boxCol;}if(couldPlace(d, row, col)) {//填充数字,并设置填充限制boxOccupied[idx][d]++;rowOccupied[row][d]++;colOccupied[col][d]++;shudoPan[row][col] = d;//是否填充到最后一格if ((col == m-1) && (row == m-1)) {sudokuSolved = true;}else {//当到达最后一列的格子,下一个格子跳转到下一行if (col == m-1) {backtrack(row + 1, 0);}else {backtrack(row, col + 1);}}if(!sudokuSolved) {//移除填充后无法进行后续填充的数boxOccupied[idx][d]--;rowOccupied[row][d]--;colOccupied[col][d]--;shudoPan[row][col] = 0;}}}}else {if ((col == m-1) && (row == m-1)) {sudokuSolved = true;}else {//当到达最后一列的格子,下一个格子跳转到下一行if (col == m-1) {backtrack(row + 1, 0);}else {backtrack(row, col + 1);}}}
}void solveSudoku() {// 初始化某数所在行、列、宫for (int i = 0; i < m; i++) {for (int k = 0; k < m; k++) {int num = shudoPan[i][k];if (num != 0) {int d = num;if(boxRow > 0) {int idx = (i / boxRow ) * boxRow + k / boxCol;boxOccupied[idx][d]++;}rowOccupied[i][d]++;colOccupied[k][d]++;}}}backtrack(0, 0);
}int main() {for(int i = 0; i < m; i++)for(int j = 0; j < m; j++)cin >> shudoPan[i][j];solveSudoku();for(int i = 0; i < m; i++) {for (int j = 0; j < m; j++) {cout << shudoPan[i][j] << " ";if(j == 2)cout << "| ";}cout << endl;if (i == 1 || i == 3)cout << "------|------" << endl;}return 0;
}
数独游戏代码C++解法相关推荐
- java数独流程图_九宫格数独游戏C语言解法
最近几天深圳一直下雨,一个人闷在屋里很是无聊,偶然打开一个小游戏网站看到了我的最爱--九宫格数独游戏.共有1-5五个难度级别,像我这种资深玩家其他难度就不用考虑了,冲着难度5的题目就去了,结果做地汗流 ...
- 数独游戏求解:解法适用于任意阶数的数独
0.数独简介 数独(すうどく,Sūdoku)是一种运用纸.笔进行演算的逻辑游戏.以九阶数独为例,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个粗线宫内的数字 ...
- Linux数独小游戏C语言,发一个自己制作的数独游戏代码!
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 void draw(int i,int j) {setcolor(5); rectangle(45+j*30,45+i*30,36+(j+1)*30,36 ...
- 数独游戏的解法到App的实现
在LeetCode上偶然刷到一个解数独的题目: 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次 ...
- [WebAssembly 入门] 实现数独游戏 - 如何优雅的组织Rust代码
title: [WebAssembly 入门] 实现数独游戏 - 如何优雅的组织Rust代码 date: 2018-4-23 22:55:00 categories: WebAssembly, 笔记 ...
- python数独游戏源代码100行_python实现解数独程序代码
偶然发现linux系统附带的一个数独游戏,打开玩了几把.无奈是个数独菜鸟,以前没玩过,根本就走不出几步就一团浆糊了. 于是就打算借助计算机的强大运算力来暴力解数独,还是很有乐趣的. 下面就记录一下我写 ...
- Python游戏项目:69行代码编写记忆数独游戏
2019独角兽企业重金招聘Python工程师标准>>> 前言 freegames是Apache2许可的免费Python游戏集合,旨在用于教育和娱乐,完全是开源的,我们只要引用编写就好 ...
- 数独游戏完整java代码_Java实现蓝桥杯数独游戏的示例代码
你一定听说过"数独"游戏. 如图,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个同色九宫内的数字均含1-9,不重复. 数独的答案都是唯一 ...
- 怎样设计解开数独游戏
很早之前大概是2014年的时候,我用WPF就是C#啦,写了一个数独游戏,那时之所以有这个想法,主要还是因为更早之前玩数独游戏时基本没有把题目解出,有点小受伤,但本葛葛毕竟是程序员啊,我解不出,可以用程 ...
- 数独游戏前端学习笔记及后续解数独方法
学习于默课网学习视频的整理笔记 视频老师分享代码库 基于我本地已经安装了nmp/node所以只添加了yarn 安装yarn: npm install -g yarn 安装成功后,查看版本号yarn - ...
最新文章
- TVM性能评估分析(三)
- 基于IndexedDB实现简单文件系统
- 如何自己写一个公用的NPM包
- sql Server snapshots
- 如何用SAP编制现金流量表
- 项目管理过程中的一些注意事项
- Python Django related_name属性使用示例
- Java HashSet和HashMap源码剖析
- 《软件工程(第4版?修订版)》—第1章1.5节 系统的方法
- 解决python中html 代码被注释掉 依旧被解释导致报错ERROR:tornado.access:500 GET /home (xxx.xxx.xxx.xxx)
- 知识图谱论文阅读(二十一)【SIGIR2019】NGCF: Neural Graph Collaborative Filtering
- android 带箭头的框,带有工具提示箭头的Android PopupWindow
- offer收割者!Alibaba内部独家MySQL优化宝典横空出世,再也不用担心被面试官拦路了
- 计算机蓝屏了 怎么维修,电脑蓝屏怎么解决
- Geany的所有主题文件
- java atm柜机_java课程设计-ATM柜机模拟程序.doc
- CentOS7.x配置三线策略路由
- 不属于c语言程序运算符,下面属于C语言关系运算符的是:( ) (A) (B) (C) =! (D) = - 试题答案网问答...
- 加油站会员管理系统源码php_一对一直播源码的开发语音与操作模式分析讲解_源码吧...
- Js放在head和body中的区别
热门文章
- ECCV 2020 目标检测论文大盘点(49篇论文)
- 医院信息化系统大全?
- 你想成为什么级别的程序员?
- notempty注解属于哪个依赖_@NotEmpty、@NotNull、@NotBlank注解解析
- vs2013设置winp#cap开发环境
- ai交互剧本_AI可以制作音乐,剧本和诗歌。 电影呢?
- 天行健---宇宙的生与死
- 外贸常用术语_对外贸易常用的贸易术语有几种?分别是,,,
- 关于连接数据库出现Connection failed: Access denied for user ‘root‘@‘localhost‘ (using password: YES)解决方案(最有用)
- PDP激活被拒绝原因码表