九宫格数独(深搜剪枝)

2024-05-14 11:12
文章标签 九宫格 剪枝 数独

本文主要是介绍九宫格数独(深搜剪枝),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

描述

在提瓦特大陆上,你作为一名旅行者发现了一个古老的神庙,里面有一块被称为“天地平衡板”的神秘石碑。为了解开石碑上的封印,你需要通过正确放置元素之力来恢复它的平衡。

天地平衡板是一个9x9的方格,每个方格可以填入代表不同元素力量的数字1-9。每种力量在每一行、每一列以及每一个由粗实线分隔的3x3宫格中必须恰好出现一次,这样才能保持元素之间的平衡。

部分格子中已经注入了元素力量(数字已知),而空白格用 '.' 表示,你的任务是找出如何在空白格中分配剩余的元素力量。

输入

一个表示天地平衡板当前状态的九宫格,每个数字对应不同的元素力量。

输出

完整的天地平衡板,每行9个字符,代表通过正确分配所有元素力量后的解决方案。

输入样例 1 
...1...57
..8.....4
4..37..2.
.......1.
...2.85..
...95....
32.7..64.
91..6..7.
..64.....
输出样例1
692184357
738592164
451376829
589637412
167248593
243951786
325719648
914863275
876425931(注意最后一行有一行空行)

代码实现

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=9;
int g[N][N];
bool st_row[N][N+1],st_col[N][N+1],st_block[3][3][N+1];
bool dfs(int x,int y)
{if(y==9)x++,y=0;if(x==9){for(int i=0;i<9;i++){for(int j=0;j<9;j++)cout<<g[i][j];cout<<endl;}return true;}if(g[x][y]!=0)return dfs(x,y+1);for(int t=1;t<=9;t++){if(st_row[x][t]==0&&st_col[y][t]==0&&st_block[x/3][y/3][t]==0){st_row[x][t]=1,st_col[y][t]=1,st_block[x/3][y/3][t]=1;g[x][y]=t;if(dfs(x,y+1))return true;g[x][y]=0;st_row[x][t]=0,st_col[y][t]=0,st_block[x/3][y/3][t]=0;}}return false;
}
int main()
{std::ios::sync_with_stdio(false);//关闭输入输出缓冲,提升效率std::cin.tie(NULL),std::cout.tie(NULL);//解除cin和cout的默认绑定,降低IO的负担提升效率memset(st_row,0,sizeof(st_row));memset(st_col,0,sizeof(st_col));memset(st_block,0,sizeof(st_block));for(int i=0;i<9;i++)for(int j=0;j<9;j++){char ch;cin>>ch;int t=0;if(ch!='.')t=ch-'0';g[i][j]=t;if(t!=0)st_row[i][t]=st_col[j][t]=st_block[i/3][j/3][t]=true;//i/3,j/3正好对应i,j所在的三宫格}dfs(0,0);return 0;
}

这篇关于九宫格数独(深搜剪枝)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/988590

相关文章

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

hdu1010 奇偶剪枝

恰好t时间到达 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.Arrays;import

[论文笔记] LLM大模型剪枝篇——2、剪枝总体方案

https://github.com/sramshetty/ShortGPT/tree/main My剪枝方案(暂定):         剪枝目标:1.5B —> 100~600M         剪枝方法:                 层粒度剪枝                 1、基于BI分数选择P%的冗余层,P=60~80                 2、对前N%冗余层,

[论文笔记] LLM大模型剪枝篇——1、调研

Attention Is All You Need But You Don’t Need All Of It For Inference of Large Language Models LLaMA2在剪枝时,跳过ffn和跳过full layer的效果差不多。相比跳过ffn/full layer,跳过attention layer的影响会更小。 跳过attention layer:7B/13B从

【教学类-52-08】20240905动物数独(6宫格)一页2张任务卡,一页一个动物贴图卡,有答案

背景需求: 前文提到6宫格数独的图片6*6=36图,如果将6张任务卡放在一个A4上,看上去6种动物很小,所以我换了一个word模板,变成了2张任务卡放在一个A4上。 【教学类-52-07】20240903动物数独(6宫格)一页2张任务卡,无答案-CSDN博客文章浏览阅读846次,点赞25次,收藏6次。【教学类-52-07】20240903动物数独(6宫格)一页2张任务卡,无答案https:

Web前端 lucky-canvas【大转盘 九宫格 老虎机】抽奖插件(适用JS/TS、Vue、React、微信小程序、Uniapp和Taro)

Web前端 lucky-canvas 抽奖插件(JS/TS、Vue、React、微信小程序、Uniapp和Taro) 基于 JS + Canvas 实现的【大转盘 & 九宫格 & 老虎机】抽奖,致力于为 WEB 前端提供一个功能强大且专业可靠的营销组件,只需要通过简单配置即可实现自由化定制,帮助你快速的完成产品需求 自由配置 奖品 / 文字 / 图片 / 颜色 / 按钮均可自由配置;支持同步

计算机秒玩数独

在线数独 #include <bits/stdc++.h>using namespace std;bool row[10][10], column[10][10], grid[10][10];int a[10][10];void dfs(int x, int y){if(a[x][y]){if(x==9 && y==9){for(int i=1; i<=9; ++i){cout<<"|

决策树__剪枝

首先剪枝(pruning)的目的是为了避免决策树模型的过拟合。因为决策树算法在学习的过程中为了尽可能的正确的分类训练样本,不停地对结点进行划分,因此这会导致整棵树的分支过多,也就导致了过拟合。决策树的剪枝策略最基本的有两种:预剪枝(pre-pruning)和后剪枝(post-pruning): 预剪枝(pre-pruning):预剪枝就是在构造决策树的过程中,先对每个结点在划分前进行估计,若果当

Leetcode面试经典150题-36.有效数独

解法都在代码里,不懂就留言或者私信,比第一题稍微难点 class Solution {public static boolean isValidSudoku(char[][] board) {/**rowExists[i][j]代表第i行是否存在数据j+1*/boolean[][] rowExists = new boolean[9][9];/**rowExists[i][j]代表第i列是否存

hdu---1010 Tempter of the Bone (经典DFS,注意剪枝)

/*经典的dfs 主要考虑剪枝否则会超时           HDU 1010  */ # include<iostream> # include<cstdio> # include<cmath> # include<cstdlib> # include<cstring> # include<string> using namespace std; char