P1074 靶形数独 dfs+预处理
https://www.luogu.org/problemnew/show/P1074
显然是dfs 而且没有什么剪枝记忆化之类的 但是预处理比较麻烦
我用三个二维数组存状态:visx[x][i]代表x行有没有选 i 这个数 visy[y][i]代表y列有没有选 i visg[g][i]代表第g个九宫格有没有选i
当遍历的时候 发现visx[x][i]==0&&visy[y][i]==0&&visg[g][i]==0 说明 i 还没有被选 就可以向下dfs
至于遍历的顺序 我们玩数独的时候都知道 肯定先从已知点比较多的地方开始考虑
比如 第一行:7 0 0 9 0 0 0 0 1 有6个位置未知
第九行:0 8 0 5 0 4 0 1 2 只有4个位置未知 那么我们肯定先考虑第九行
所以只需要把行sort排序一下 调整一下遍历的顺序即可
不过排序又引申出来一个问题 就是我们不知道排序之后的第一行 原来是第几行 为了解决这个问题 我们可以用一个结构体存储每一行有几个未知位置:
typedef struct
{
int nums=; //未知位置数量
int x; //行数
}node;
最后 我们需要维护一个一维数组,用来保存修正后的遍历的序列(当然二维也可以)
最后的的最后 每找到一组数独的解 都要更新最大值
具体看代码吧:
#include<bits/stdc++.h> using namespace std; typedef struct
{
int nums=;
int x;
}node;
node e[]; int m[][],anss,u,visx[][],visy[][],visg[][],q[],pre,flag;
int s[][]={,,,,,,,,,,, //保存每个位置上的分数 比较懒 直接打表了
,,,,,,,,,,,
,,,,,,,,,,,
,,,,,,,,,,,
,,,,,,,,,,,
,,,,,,,,,,,
,,,,,,,,,,,
,,,,,,,,,,,
,,,,,,,,,,,
,,,,,,,,,,,
,,,,,,,,,,}; bool cmp(node a,node b)
{
return a.nums<b.nums;
} void dfs(int t)
{
int i,j;
if(t==u+)
{
flag=;
int p=;
for(i=;i<=;i++)
for(j=;j<=;j++)
p+=m[i][j]*s[i][j];
anss=max(anss,p); //更新最大值
return;
}
int x=(q[t]-)/+;
int y=q[t]-(x-)*;
int g=((x-)/)*+(y-)/+;
for(i=;i<=;i++)
{
if(visx[x][i]==&&visy[y][i]==&&visg[g][i]==)
{
visx[x][i]=;
visy[y][i]=;
visg[g][i]=;
m[x][y]=i;
dfs(t+);
visx[x][i]=;
visy[y][i]=;
visg[g][i]=;
}
}
} int main()
{
int i,j;
for(i=;i<=;i++)
e[i].x=i;
for(i=;i<=;i++)
for(j=;j<=;j++)
{
scanf("%d",&m[i][j]);
if(m[i][j]==)
e[i].nums++;
else
{
pre+=m[i][j]*s[i][j];
visx[i][m[i][j]]=;
visy[j][m[i][j]]=;
int g=((i-)/)*+(j-)/+; //计算当前点属于哪一个九宫格
visg[g][m[i][j]]=;
}
}
sort(e+,e+,cmp);
for(i=;i<=;i++)
for(j=;j<=;j++)
{
if(m[e[i].x][j]==)
{
int nums=(e[i].x-)*+j; //如果当前位置未知,把他放入准备遍历的序列里
q[++u]=nums; //u记录了有多少点未知
}
}
dfs();
if(flag==) //如果无解
{
cout<<-<<endl;
return ;
}
cout<<anss<<endl; }
P1074 靶形数独 dfs+预处理的更多相关文章
- P1074 靶形数独 dfs回溯法
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“靶 ...
- P1074 靶形数独
P1074 靶形数独正着搜80分,完全倒置95分,完全倒置后左右再倒置,就会A掉,到时候脑洞要大一些. #include<iostream> #include<cstdio> ...
- 洛谷——P1074 靶形数独
P1074 靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z ...
- P1074 靶形数独题解
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“靶 ...
- 洛谷P1074 靶形数独 [搜索]
题目传送门 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了 ...
- NOIP2009靶形数独[DFS 优化]
描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z博士请教,Z 博士拿出了他最近发明的“靶形数独 ...
- [洛谷P1074] 靶形数独
洛谷题目链接:靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博 ...
- 洛谷 P1074 靶形数独
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...
- [NOIP2009] 提高组 洛谷P1074 靶形数独
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...
随机推荐
- Console Add Item –Java使用eBay API SDK刊登商品 详解
准备工作: 1. 运行Eclipse (或其他Java IDE) 2.创建一个ConsoleAddItem工程(项目) 选JDK 1.5.1.6.1.8等版本,已测试1.6.1.8版本. 3.下载JA ...
- 指数家族-Beta分布
2. Beta分布 2.1 Beta分布 我们将由几个问题来得引出几个分布: 问题一:1: 2:把这个 个随机变量排序后得到顺序统计量 3:问 是什么分布 首先我们尝试计算 落在一个区间 ...
- Delphi---ShellExecute跨进程调用exe
测试环境:Delphi7 + Win7 发起端 unit uRequest; interface uses Windows, Messages, SysUtils, Variants, Classes ...
- excel中汉字转拼音
Excel中文转拼音(完整版)打开Excel->工具->宏->Viaual Basic编辑器在弹出来的窗口中对着VBAproject点右键->插入->模块下面会出现一个名 ...
- Python使用XML操作mapnik,实现复杂标注(Multi line text symbolizer)
test.py import mapnik stylesheet = 'world_style.xml' image = 'world_style.png' m = mapnik.Map(1200, ...
- Tomcat的安装、配置常见问题
(1)服务里面没有Tomcat怎么办? ——运行:cmd=>再到Tomcat 8.0/bin目录下运行: service install 即可: ——然后用: net start Tomc ...
- POJ 3180 牛围着池塘跳舞 强连通分量裸题
题意:一群牛被有向的绳子拴起来,如果有一些牛(>=2)的绳子是同向的,他们就能跳跃.求能够跳跃的组数. #include <iostream> #include <cstdio ...
- 类锁和对象锁,synchronized修饰static方法与非static方法的区别
当synchronized修饰一个static方法时,多线程下,获取的是类锁(即Class本身,注意:不是实例), 作用范围是整个静态方法,作用的对象是这个类的所有对象. 当synchronized修 ...
- shell基础操作
一.字符串 字符串是shell编程中最常用的数据类型,字符串可以用单引号,也可以用双引号,也可以不用引号. 单引号 name='xiaoxi' 单引号的限制: 单引号里的任何字符都会原样输出,单引号中 ...
- sqli-labs(28)---原创原创自此一家
0X01构造闭合 ’报错 )报错 其他不报错 那我们猜想是不是')的闭合 ?id=')=('1 返回正确 那么好像猜对了 0X02爆表名 过滤了相连接的union和select ?id= 这里过滤了相 ...