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+预处理的更多相关文章

  1. P1074 靶形数独 dfs回溯法

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

  2. P1074 靶形数独

    P1074 靶形数独正着搜80分,完全倒置95分,完全倒置后左右再倒置,就会A掉,到时候脑洞要大一些. #include<iostream> #include<cstdio> ...

  3. 洛谷——P1074 靶形数独

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

  4. P1074 靶形数独题解

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

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

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

  6. NOIP2009靶形数独[DFS 优化]

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

  7. [洛谷P1074] 靶形数独

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

  8. 洛谷 P1074 靶形数独

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

  9. [NOIP2009] 提高组 洛谷P1074 靶形数独

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

随机推荐

  1. ps制作雾的效果

    制作雾的效果 方法一: 新建图层,将前景色设置为白色,背景色为黑色(因为雾的颜色是根据前景色决定的,也可根据这个原理制作火焰效果) 选择滤镜->渲染->云彩(也可选择其他效果的云彩) (选 ...

  2. 通过继承Thread类实现多线程

    (1)继承Thread类(2)重写run(方法(3)通过start0方法启动线程 一定的缺点: Java中的类是单继承的,一旦继承了Thread类,就不允许再去继承其它的类 线程和主方法之间的执行顺序 ...

  3. wordpress设置本地化语言

    wordpress语言本地化 在wordpress上很多插件不支持本地化语言如:中文,需要本地化,则需要制作本地化语言的po(用于编辑)和mo(用于机器识别)文件.可以没有*.po文件,但是不能没有* ...

  4. 怎样将shp文件的坐标点导出来?

    方法一: 1.将线矢量转化为点矢量 具体操作步骤如下: (1)arctoolbox\Data Management tools\Features\双击Feature Vertices to point ...

  5. Html5大文件断点续传实现方法

    之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...

  6. Anaconda安装PyTorch

    Anaconda是一个Python语言管理器,支持安装基于Python的开发包,例如tensorflow.Pytorch等,以及各种基于Python的IDE. https://www.jb51.net ...

  7. Js自定义数组map之bigmap

    /** * like map,but prev,curr,next and index will be given * @param {Function} cb Callback,the parame ...

  8. C# DataTable 增加行与列

    亲测有用的方法 DataTable AllInfos = new DataTable();//生成一个表格 DataColumn typeColumn = new DataColumn();//建一个 ...

  9. linux fedora原生的快捷键操作

    显示桌面: ctrl+alt+d 运行终端程序: gnome-terminal : 可以自定义快捷键: ctrl+T 等等.

  10. ASP.NET对路径"C:/......."的访问被拒绝 解决方法小结 [转载]

    问题: 异常详细信息: System.UnauthorizedAccessException: 对路径“C:/Supermarket/output.pdf”的访问被拒绝. 解决方法: 一.在IIS中的 ...