博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ZOJ 1008 Gnome Tetravex
阅读量:4683 次
发布时间:2019-06-09

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

DFS 题目,剪枝比较重要,这里使用的是把重复的方块只记录一次,用 num[] 保存它的数目。

# include 
# include
# define N 25 + 2bool finished;int n, m, t[N][4], num[N], ans[N];void dfs(int cnt){ if (cnt == n*n) {finished = true; return ;} int x = cnt/n + 1, y = cnt%n + 1; int left = cnt, top = cnt+1-n; for (int i = 0; i < m; ++i) if (num[i]) { bool ok = true; if (x!=1 && t[i][0] != t[ans[top]][2]) ok = false; if(ok && y!=1 && t[i][3] != t[ans[left]][1]) ok = false; if (ok) { --num[i]; ans[cnt+1] = i; dfs(cnt+1); if(finished) return ; ++num[i]; } }}void init(void){ bool rpt; int top, rig, bot, lef; m = 0; memset(num, 0, sizeof(num)); for (int i = 0; i < n*n; ++i) { rpt = false; scanf("%d%d%d%d", &top, &rig, &bot, &lef); for (int j = 0; j < m; ++j) { if (t[j][0] == top && t[j][1] == rig && t[j][2] == bot && t[j][3] == lef) { rpt = true; ++num[j]; break; } } if (rpt) continue; t[m][0] = top, t[m][1] = rig, t[m][2] = bot, t[m][3] = lef; ++num[m]; ++m; }}void solve(void){ finished = false; dfs(0); if (finished) puts("Possible"); else puts("Impossible");}int main(){ int i = 0; while (~scanf("%d", &n)) { if (!n) break; init(); if(i != 0) putchar('\n'); printf("Game %d: ", ++i); solve(); } return 0;}

/**/

转载于:https://www.cnblogs.com/JMDWQ/archive/2012/07/18/2597737.html

你可能感兴趣的文章
序列化 与 反序列化
查看>>
购物车
查看>>
python基础(一)
查看>>
UI设计篇·入门篇·绘制简单自定义矩形图/设置按钮按下弹起颜色变化/设置图形旋转...
查看>>
linux 使用NSF 映射远程磁盘目录
查看>>
elasticjob 当当的分布式定时任务管理
查看>>
BZOJ 3438: 小M的作物( 最小割 )
查看>>
js性能优化-事件委托(2)
查看>>
Determine File Output Location
查看>>
51NOD 1068 Bash游戏 V3
查看>>
级联。。。
查看>>
socketserver用法列子
查看>>
网站链接被微信屏蔽拦截了怎么办?VJump帮你解除屏蔽
查看>>
SVG.text基本属性
查看>>
Sublime Text3配置Node.js开发环境
查看>>
在线编辑器的原理简单示例
查看>>
MVC弹出子页面向父页面传值
查看>>
用shell定义和访问数组
查看>>
KNN算法原理以及代码实现
查看>>
解读typescript中 super关键字的用法
查看>>