博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 2514 Another Eight Puzzle
阅读量:6349 次
发布时间:2019-06-22

本文共 1857 字,大约阅读时间需要 6 分钟。

题目:

对8个位置填数,有连线的两个位置不能填连续的数.

搜索时加上限定条件即可.除了搜索,记得还有一种更优雅的解法.

#include 
using namespace std;int judge[8][8] = {
{
3,1,2,3},{
4,0,2,4,5},{
6,0,1,3,4,5,6},{
4,0,2,5,6},{
4,1,2,5,7},{
6,1,2,3,4,6,7},{
4,2,3,5,7},{
3,4,5,6}};//judge[i][0] = 第i列相连点的数量,judge[i][j](j>0) = 相连点.图的数组结构int num = 0; //记录解的数量bool vis[9]; // vis记录8个数中被用过的数int a[8],fil[8],seq[8];; // fil记录有多少个待填点int n;void dfs(int t){ if(num > 1) return; if(t == n) { num ++ ; for(int i=0;i < 8;i++) { seq[i] = a[i]; } return; } for(int i = 1;i <= 8;i++) //枚举8个数 { if(!vis[i]) { for(int j=1;j < judge[fil[t]][0];j++) //枚举相连点 { if(abs(a[judge[fil[t]][j]] - i) == 1 && a[judge[fil[t]][j]] != 0) //若连续则跳过 { break; } } if(j < judge[fil[t]][0]) continue; //若非正常退出,则出现连续break跳出则不满足条件 //否则,进行深搜 vis[i] = 1; a[fil[t]] = i; dfs(t+1); if(num > 1) return; vis[i] = 0; a[fil[t]] = 0; } }}int main(int argc, const char *argv[]){ int T;// freopen("input.txt","r",stdin); cin>>T; for(int k = 1;k <= T;k++) { n = 0; memset(vis,0,sizeof(vis)); for(int i=0;i < 8;i++) { cin>>a[i]; if(a[i]) vis[a[i]] = 1; else if(!a[i]) //若为0.fil记录位置 { fil[n++] = i; } } num = 0; dfs(0); cout<<"Case "<
<<":"<<" "; if(num == 1) { cout<
< 8;i++) { cout<<" "<
1) cout<<"Not unique"<

 

转载于:https://www.cnblogs.com/destino74/p/3323231.html

你可能感兴趣的文章
《慕客网:IOS基础入门之Foundation框架初体验》学习笔记 <一>
查看>>
Spring声明式事务管理之二:核心接口API
查看>>
解决:在微信中访问app下载链接提示“已停止访问该网页”
查看>>
LNMP环境安装(二)
查看>>
MFC对话框编程-图片控件
查看>>
nodejs启动webserver服务
查看>>
小偷被抓叫嚣:我不偷警察没饭吃
查看>>
python初学—-实现excel里面读数据进行排序
查看>>
用户体验升级后 “谁行谁上”让百度Q4财报更有底气
查看>>
直播相关学习链接
查看>>
使用RPM包工具和源码包编译安装Linux应用程序
查看>>
VoIP——开启免费通话新时代的先锋
查看>>
Linux下rsync的用法
查看>>
apache虚拟主机、日志轮询、日志统计、去版本优化
查看>>
java代码实现开启openoffice服务和关闭sffice.exe进程
查看>>
docker镜像的使用方法
查看>>
提升HTTPS安全评级
查看>>
iOS开发过程中的心得
查看>>
QOS配置命令
查看>>
linux安装搭建media-wiki
查看>>