链接:

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;
for (int i = 0;i < 9;i++)
{
for (int j = 0;j < 9;j++)
{
if (Map[i][j] != '.')
continue;
int val = row[i]&col[j]&gri[GetP(i, j)];
if (val == 0)
return false;
if (Cnt[val] < tmp)
{
tmp = Cnt[val];
x = i, y = j;
}
}
}
int val = row[x]&col[y]&gri[GetP(x, y)];
while (val > 0)
{
int z = Num[Lowbit(val)];
Map[x][y] = z+'1';
Change(x, y, z);
if (Dfs(las-1))
return true;
Change(x, y, z);
Map[x][y] = '.';
val -= Lowbit(val);
}
return false;
} int main()
{
for (int i = 0;i < (1<<9);i++)
{
for (int j = i;j > 0;j -= Lowbit(j))
Cnt[i]++;
}
for (int i = 0;i < 9;i++)
Num[1<<i] = i;
while (scanf("%s", input) && input[0] != 'e')
{
for (int i = 0;i < 9;i++)
{
for (int j = 0;j < 9;j++)
Map[i][j] = input[i*9+j];
}
for (int i = 0;i < 9;i++)
row[i] = col[i] = gri[i] = (1<<9)-1;
cnt = 0;
for (int i = 0;i < 9;i++)
{
for (int j = 0;j < 9;j++)
{
if (Map[i][j] != '.')
Change(i, j, Map[i][j]-'1');
else
cnt++;
}
}
Dfs(cnt);
for (int i = 0;i < 9;i++)
{
for (int j = 0;j < 9;j++)
input[i*9+j] = Map[i][j];
}
puts(input);
} return 0;
}

Acwing-166-数独(搜索)的更多相关文章

  1. AcWing 166. 数独

    题目地址 https://www.acwing.com/problem/content/description/168/ 题目描述 数独是一种传统益智游戏,你需要把一个9 × 9的数独补充完整,使得图 ...

  2. 洛谷P1074 靶形数独 [搜索]

    题目传送门 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了 ...

  3. 166. 数独 dancing links 方法

    dfs硬怼通过数独 N皇后的代码后 想学习下新的数据结构和算法来解决这类覆盖问题 习题练习 https://www.acwing.com/problem/content/168/ 数独 https:/ ...

  4. HDU - 5547 Sudoku(数独搜索)

    Description Yi Sima was one of the best counselors of Cao Cao. He likes to play a funny game himself ...

  5. B3109 [cqoi2013]新数独 搜索dfs

    就是基于普通数独上的一点变形,然后就没什么了,普通数独就是进行一边dfs就行了. 题干: 题目描述 输入格式 输入一共15行,包含一个新数独的实例.第奇数行包含左右方向的符号(<和>),第 ...

  6. Python搜索书名获取整本资源_笔趣阁

    前言 偶然一天把某项目文档传到手机上,用手机自带的阅读器方便随时拿出来查阅.看着我那好久没点开的阅读器,再看着书架上摆着几本不知道是多久之前导入的小说. 闭上眼,我仿佛看到那时候的自己.侧躺着缩在被窝 ...

  7. $NOIp$提高组历年题目复习

    写在前面 一个简略的\(NOIp\)题高组历年题目复习记录.大部分都有单独写题解,但懒得放\(link\)了\(QwQ\).对于想的时候兜了圈子的题打上\(*\). \(NOIp2018\ [4/6] ...

  8. [NOIP2009] 靶形数独(搜索+剪枝)

    题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...

  9. hihoCoder #1321 : 搜索五•数独 (Dancing Links ,精确覆盖)

    hiho一下第102周的题目. 原题地址:http://hihocoder.com/problemset/problem/1321 题意:输入一个9*9数独矩阵,0表示没填的空位,输出这个数独的答案. ...

  10. Luogu P1074靶形数独【搜索/剪枝】By cellur925

    题目传送门 显然是一个搜索.但是开始没有任何的剪枝,暴力从\((1,1)\)点开始搜索,很自然地T了6个点. #include<cstdio> #include<algorithm& ...

随机推荐

  1. 【转】nosql的分类

    1 键值数据库 相关产品:Redis.Riak.SimpleDB.Chordless.Scalaris.Memcached 形式:Key 指向 Value 的键值对,通常用hash table来实现 ...

  2. spark-scala-java实现wordcount

    引入:spark-scala-java实现wordcount 1.spark-scala实现wordcount package com.cw.scala.spark import org.apache ...

  3. windows环境下使用C++&Socket实现文件传输

    server #include <stdio.h> #include <iostream> #include <cstring> #include <fstr ...

  4. crontab中的%

    crontab中的%是换行的意思,在使用时需要使用\做转义. ----------------- 在用crontab执行一段定时任务时,想要把数据输出到一个日期命名的文件中 * * * * * cd ...

  5. django form组件 cookies,session

    django form组件 渲染标签  就是组件里面的字段在前端展示叫做渲染标签 校验数据  用户输入的数据提交给后端组件叫做校验数据 forms组件中定义的字段都是必须传值的(required=Tr ...

  6. C/S软件方案

    互联网时代客户端软件的一些方案 纯Native开发, C++/C#/duilib+C++(Windows), Objective-c(Mac) Qt(Windows/Mac) NW.js/Electr ...

  7. jenkins+docker+git+etcd实现应用配置文件管理

    两台机器: 一台机器安装gitlab: http://www.cnblogs.com/cjsblogs/p/8716932.html 另一台机器安装etcd+docker+jenkins jenkin ...

  8. hdu 1969 pie 卡精度的二分

    Pie Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  9. js判断是否是对象获取子窗体值

    判断是否是对象 Object.prototype.toString.call(obj) 装换为数组 Array.prototype.slice.call(obj) 父窗体获取值子窗体值$(functi ...

  10. QByteArray详解

    QByteArray在串口通讯中经常被使用,有一定必要较为全面详细的对QByteArray进行阐述.本文通过以下几个部分加以介绍: 1. 初始化 2. 访问与赋值 3. 添加.删除.插入与替换操作 4 ...