首页 > 其他分享 >搜索 题目

搜索 题目

时间:2023-09-09 15:44:37浏览次数:46  
标签:题目 int long 20 搜索 const include

Sudoku(9*9)

link1:数据强度弱
link2:数据强度强

两个优化:

  1. 按照人类直觉,可以填的数越少的位置越先填
  2. 使用二进制数字记录一行、列、宫中哪些数字用过,不使用数组,常数优化
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std ;

typedef long long ll ;
const int N = 1000010 ;
const int M = (1 << 11) ;

bool flag ;
int n, T, tot ;
char s[20][20] ;
int row[20], col[20], blk[20] ; // block -> int
int belong[20][20] ;
int cnt[M], dig[M] ;

void pre() {
	for (int i = 0; i <= 2; i++)
	for (int j = 0; j <= 2; j++) {
		belong[i][j] = 0 ;
		belong[i][j + 3] = 1 ;
		belong[i][j + 6] = 2 ;
		belong[i + 3][j] = 3 ;
		belong[i + 3][j + 3] = 4 ;
		belong[i + 3][j + 6] = 5 ;
		belong[i + 6][j] = 6 ;
		belong[i + 6][j + 3] = 7 ;
		belong[i + 6][j + 6] = 8 ;
	}
	for (int i = 0; i <= (1 << 9); i++) 
	for (int j = i; j; j -= j & -j) cnt[i]++ ;
	for (int i = 0; i <= 9; i++) dig[1 << i] = i ;
	
}

void init() {
	tot = 0 ;
	for (int i = 0; i < n; i++) row[i] = col[i] = blk[i] = (1 << 9) - 1 ;
}

void flip(int x, int y, int z) {
	row[x] ^= (1 << z) ;
	col[y] ^= (1 << z) ;
	blk[belong[x][y]] ^= (1 << z) ;
}

int dfs(int step) {
	if (step == 0) {
		flag = true ;
		return 1 ;
	}
	int ans = (1 << 9) - 1, dx, dy ;
	for (int i = 0; i < 9; i++)
	for (int j = 0; j < 9; j++)
	if (s[i][j] == '0') {
		int t = row[i] & col[j] & blk[belong[i][j]] ;
		if (cnt[t] < cnt[ans]) {
			ans = t ;
			dx = i, dy = j ; 
		}
	}
	while (ans) {
		int t = ans & -ans ; ans -= ans & -ans ; t = dig[t] ;
		s[dx][dy] = t + '1' ;
		flip(dx, dy, t) ;
		if (dfs(step - 1)) return 1 ;
		s[dx][dy] = '0' ;
		flip(dx, dy, t) ;
	}
	return 0 ; 
}

int main() {
	n = 9 ;
	scanf("%d", &T) ;
	pre() ;
	while (T--) {
		init() ;
		for (int i = 0; i < n; i++) scanf("%s", s[i]) ;
		for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
		if (s[i][j] == '0') tot++ ;
		else flip(i, j, s[i][j] - '1') ;
		dfs(tot) ;
		for (int i = 0; i < n; i++) printf("%s\n" , s[i]) ;
	} 
}

标签:题目,int,long,20,搜索,const,include
From: https://www.cnblogs.com/lighthqg/p/17689572.html

相关文章

  • 剑指 Offer 54. 二叉搜索树的第k大节点
    题目链接:剑指Offer54.二叉搜索树的第k大节点题目描述:给定一棵二叉搜索树,请找出其中第k大的节点的值。解法思路:由于题目中二叉树是二叉搜索树(中序遍历是升序的),要求的是第k大的节点值,也就是倒数第k个数,因此可以转换一下遍历顺序,按照右->根->左的顺序进行遍历的话,得......
  • 网站优化搜索引擎与关键词
    网站优化搜索引擎与关键词人们不应该高估搜索引擎的智商。这不利于seo的研究,事实上,搜索引擎是非常愚蠢的,让我们举一个非常简单的例子,你在搜索引擎中输入“教师”这个词,搜索引擎就会给出一个准确的搜索列表。我们不会给出“教师”一词的检索信息,但我们认为,“教师”和“教师”的含义......
  • SQL注入——搜索型
    SQL注入—搜索型搜索型注入—原理介绍一些网站为了方便用户查找网站的资源,都对用户提供了搜索的功能,因为是搜索功能,往往是程序员在编写代码时都忽略了对其变量(参数)的过滤,而且这样的漏洞在国内的系统中普遍的存在;其中又分为POST/GET,GET型的一般是用在网站上的搜索,而POST则......
  • Java并发篇:6个必备的Java并发面试种子题目
    线程创建和生命周期线程的创建和生命周期涉及到线程的产生、执行和结束过程。让我们继续深入探索这个主题:线程的创建方式有多种,你可以选择适合你场景的方式:继承Thread类:创建一个类,继承自Thread类,并重写run()方法。通过实例化这个类的对象,并调用start()方法,系统会自动调用run()方法......
  • 单词搜索 II(字典树、数组)、合并两个有序数组(数组、双指针)、验证回文串(双指针、字
    单词搜索II(字典树、数组)给定一个mxn二维字符网格board****和一个单词(字符串)列表words,找出所有同时在二维网格和字典中出现的单词。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一......
  • 搜索 优化方法(大纲)
    剪枝策略调整搜索顺序(层次)比如让体积大的先选,或者选择比较少的位置先枚举排除等效冗余发现两个搜索状态(子树)其实是等价的(比如\(A+B\)和\(B+A\)),只需要枚举其中一种即可可行性剪枝不行的状态直接\(skip\)最优性剪枝现在的花费已经大于答案直接\(skip\)A*的思路:现在的答花......
  • minio 支持object搜索方案
    minio支持上传时对object打标签,查询时可以根据标签做筛选。但是有ftp上传文件的需求,导致无法给object打标签。并且也不清楚minio对于根据标签的筛选性能如何,因此我们打算将object的对象的数据放到数据库。在数据库中对object进行筛选。docker部署mkdir-p~/minio/datadocker......
  • 【题解】《PTA-Python程序设计》题目集分享
    第1章-1从键盘输入两个数,求它们的和并输出(30分)本题目要求读入2个整数A和B,然后输出它们的和。输入格式:在一行中给出一个被加数在另一行中给出一个加数输出格式:在一行中输出和值。输入样例:在这里给出一组输入。例如:18-48输出样例:在这里给出相应的输出。例如:......
  • 罗技M720删除蓝牙连接后,蓝牙搜索列表找不到设备
    原因因误删蓝牙鼠标(罗技M720)设备,再次添加蓝牙设备时蓝牙列表找不到设备(罗技M720)。蓝牙配对1、确保 M720已开启2、按住显示屏下方的切换按钮3秒钟(所选通道上的LED将开始快速闪烁)3、此时再打开蓝牙列表就可以发现鼠标了 找不到设备或连接不上的问题有很多种,具体情况要具体分析......
  • 关于 Google 搜索运作方式的解析
    Google搜索是一款全自动搜索引擎,会使用名为“网页抓取工具”的软件定期探索网络,找出可添加到Google索引中的网页。实际上,Google搜索结果中收录的大多数网页都不是手动提交的,而是我们的网页抓取工具在探索网络时找到并自动添加的。本文档从网站的角度介绍了Google搜索运作方式......