[BZOJ1501][NOI2005] 智慧珠游戏

Input
文件中包含初始的盘件描述,一共有10行,第i行有i个字符。如果第i行的第j个字符是字母”A”至”L”中的一个,则表示第i行第j列的格子上已经放了零件,零件的编号为对应的字母。如果第i行的第j个字符是”.”,则表示第i行第j列的格子上没有放零件。输入保证预放的零件已摆放在盘件中。
Output
如果能找到解,向输出文件打印10行,为放完全部12个零件后的布局。其中,第i行应包含i个字符,第i行的第j个字符表示第i行第j列的格子上放的是哪个零件。如果无解,输出单独的一个字符串‘No solution’(不要引号,请注意大小写)。所有的数据保证最多只有一组解。
Sample Input
..
...
....
.....
.....C
...CCC.
EEEHH...
E.HHH....
E.........
Sample Output
BK
BKK
BJKK
JJJDD
GJGDDC
GGGCCCI
EEEHHIIA
ELHHHIAAF
ELLLLIFFFF
#include <cstdio>
#include <cstdlib>
#define MAXN 15
#define DFS_next if (y == x) DFS(x + 1, 1); else DFS(x, y + 1)
const int a[100][6] = {
{0, 0, 0, 0, 0, 0},
{0, 1, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0}, {0, 1, 1, 0, 0, 0}, {0, 1, 1, 0, 0, 0},
{0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},
{0, 1, 2, 3, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0}, {0, 0, 1, 2, 0, 0}, {0, 1, 1, 1, 0, 0}, {0, 1, 2, 2, 0, 0},
{0, 1, 1, 1, 0, 0}, {0, 0, 1, 2, 0, 0}, {0, 0, 0, 1, 0, 0}, {0, 1, 2, 2, 0, 0},
{0, 0, 1, 1, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},
{0, 1, 2, 2, 2, 0}, {0, 0, 0, 1, 2, 0}, {0, 1, 2, 2, 2, 0}, {0, 0, 0, 1, 2, 0},
{0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 1, 0}, {0, 1, 1, 2, 3, 0}, {0, 1, 1, 1, 1, 0}, {0, 1, 2, 3, 2, 0},
{0, 1, 1, 1, 1, 0}, {0, 1, 1, 2, 3, 0}, {0, 0, 0, 0, 1, 0}, {0, 1, 2, 2, 3, 0},
{0, 0, 0, 1, 1, 0}, {0, 1, 2, 0, 2, 0}, {0, 1, 1, 1, 0, 0}, {0, 0, 1, 2, 2, 0},
{0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 1, 0}, {0, 0, 1, 1, 1, 0}, {0, 1, 0, 1, 2, 0}, {0, 1, 2, 2, 1, 0},
{0, 0, 1, 1, 1, 0}, {0, 0, 1, 1, 2, 0}, {0, 1, 1, 2, 2, 0}, {0, 0, 0, 1, 1, 0},
{0, 0, 0, 1, 1, 0}, {0, 1, 2, 2, 3, 0}, {0, 0, 1, 1, 1, 0}, {0, 1, 1, 2, 3, 0},
{0, 0, 1, 1, 1, 0}, {0, 1, 2, 2, 3, 0}, {0, 0, 0, 1, 1, 0}, {0, 1, 1, 2, 3, 0},
{0, 1, 1, 1, 2, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},
{0, 1, 1, 2, 2, 0}, {0, 0, 1, 1, 2, 0}, {0, 0, 1, 1, 2, 0}, {0, 1, 1, 2, 2, 0},
{0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 1, 0}, {0, 0, 1, 2, 3, 0}, {0, 1, 1, 1, 1, 0}, {0, 1, 2, 3, 3, 0},
{0, 1, 1, 1, 1, 0}, {0, 0, 1, 2, 3, 0}, {0, 0, 0, 0, 1, 0}, {0, 1, 2, 3, 3, 0}
};
const int b[100][6] = {
{0, 0, 0, 0, 0, 0},
{0, 0, 1, 0, 0, 0}, {0, 1, 1, 0, 0, 0}, {0,-1, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0}, {0, 1, 2, 3, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},
{0, 1, 2, 0, 0, 0}, {0, 1, 1, 1, 0, 0}, {0, 0,-1,-2, 0, 0}, {0, 0, 0, 1, 0, 0},
{0, 0, 1, 2, 0, 0}, {0, 1, 0, 0, 0, 0}, {0, 1, 2, 2, 0, 0}, {0, 0, 0,-1, 0, 0},
{0, 1, 1, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 2, 0}, {0, 1, 2, 2, 2, 0}, {0, 0, 0,-1,-2, 0}, {0, 1, 2, 0, 0, 0},
{0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},
{0, 1, 2, 3, 1, 0}, {0, 0,-1, 0, 0, 0}, {0,-2,-1, 0, 1, 0}, {0, 0, 0, 0, 1, 0},
{0,-1, 0, 1, 2, 0}, {0, 0, 1, 0, 0, 0}, {0, 1, 2, 3, 2, 0}, {0, 0,-1, 0, 0, 0},
{0, 1, 2, 0, 2, 0}, {0, 0, 0, 1, 1, 0}, {0, 0, 1, 2, 2, 0}, {0, 1, 1, 1, 0, 0},
{0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},
{0, 1, 2, 0, 1, 0}, {0, 1,-1, 0, 1, 0}, {0, 0, 1, 1, 1, 0}, {0, 0, 0, 1, 1, 0},
{0, 1, 0, 1, 2, 0}, {0, 1, 0, 1, 0, 0}, {0,-1, 0,-1, 0, 0}, {0, 1, 2, 1, 2, 0},
{0, 1, 2, 2, 3, 0}, {0, 0, 0,-1,-1, 0}, {0, 1, 1, 2, 3, 0}, {0, 0,-1,-1,-1, 0},
{0, 1, 0,-1,-2, 0}, {0, 0, 0, 1, 1, 0}, {0, 1, 2,-1, 0, 0}, {0, 0, 1, 1, 1, 0},
{0,-1, 0, 1, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},
{0, 0, 1, 1, 2, 0}, {0, 1, 0,-1,-1, 0}, {0, 1, 1, 2, 2, 0}, {0, 0,-1,-1,-2, 0},
{0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},
{0, 1, 2, 3, 0, 0}, {0, 1, 1, 1, 1, 0}, {0, 0,-1,-2,-3, 0}, {0, 0, 0, 0, 1, 0},
{0, 0, 1, 2, 3, 0}, {0, 1, 0, 0, 0, 0}, {0, 1, 2, 3, 3, 0}, {0, 0, 0, 0,-1, 0}
};
const int tot[100] = {0, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5};
const int inv[100] = {0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0};
int vis[MAXN][MAXN], map[MAXN][MAXN], use[MAXN];
bool out(int o) { return o < 1 || o > 10; }
bool check(int o, int x, int y)
{
if (inv[o]) return 0;
for (int i = 1; i < tot[o]; i++)
{
int dx = x + a[o][i], dy = y + b[o][i];
if (out(dx) || out(dy)) return 0;
if (vis[dx][dy]) return 0;
}
return 1;
}
void DFS(int x, int y)
{
if (x == 11 && y == 1)
{
for (int i = 1; i <= 10; i++)
{
for (int j = 1; j <= i; j++) printf("%c",map[i][j] + 'A' - 1);
printf("\n");
}
exit(0);
}
if (vis[x][y]) { DFS_next; }
else for (int i = 1; i <= 12; i++)
{
if (use[i]) continue;
for (int j = 0; j <= 7; j++)
{
int o = i * 8 - j;
if (check(o, x, y))
{
for (int k = 0; k < tot[o]; k++)
vis[x + a[o][k]][y + b[o][k]] = 1, map[x + a[o][k]][y + b[o][k]] = i;
use[i] = 1; DFS_next; use[i] = 0;
for (int k = 0; k < tot[o]; k++) vis[x + a[o][k]][y + b[o][k]] = 0;
}
}
}
}
char ch[MAXN];
int main()
{
freopen("game.in", "r", stdin);
freopen("game.out", "w", stdout);
for (int i = 1; i <= 10; i++)
{
scanf("%s",ch);
for (int j = 0; j <= i - 1; j++)
{
if (ch[j] == '.') map[i][j + 1] = 0;
else map[i][j + 1] = ch[j] - 'A' + 1, vis[i][j + 1] = 1, use[ch[j] - 'A' + 1] = 1;
}
}
for (int i = 1; i <= 10; i++)
for (int j = 10; j > i; j--) vis[i][j] = 1;
DFS(1,1);
printf("No solution");
return 0;
}
[BZOJ1501][NOI2005] 智慧珠游戏的更多相关文章
- 【搜索好题】bzoj1501 [NOI2005]智慧珠游戏
bzoj1501 [NOI2005]智慧珠游戏 搜索苟逼题系列. 暴力枚举每一种情况(包括旋转翻转全都考虑在内)然后码出代码. (正解似乎不是这样子的) 那年好像还有平衡树苟逼题维护数列233333心 ...
- bzoj 1501: [NOI2005]智慧珠游戏 Dancing Link
1501: [NOI2005]智慧珠游戏 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 190 Solved: 122[Submit][Status] ...
- 洛谷 P4205 [NOI2005]智慧珠游戏 DFS
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P4205 [NOI2005]智慧珠游戏 题目描述 智慧 ...
- Luogu P4205 [NOI2005]智慧珠游戏
国内少有的可以练习神仙算法--DLX的好题怎么可以被爆搜埋没呢? 看到这题没有DLX的题解所以写一篇,不过貌似我实现的太弱(构图太慢)所以速度上不是很快. 下面开始讲题,但请保证你要先学会DLX.(d ...
- 【BZOJ1501】【NOI2005】智慧珠游戏(搜索)
[BZOJ1501][NOI2005]智慧珠游戏(搜索) 题面 我要一改我懒惰的作风 这道题目必须放题面 Description Input 文件中包含初始的盘件描述,一共有10行,第i行有i个字符. ...
- BZOJ 1501 智慧珠游戏
Description Input 文件中包含初始的盘件描述,一共有10行,第i行有i个字符.如果第i行的第j个字符是字母”A”至”L”中的一个,则表示第i行第j列的格子上已经放了零件,零件的编号为对 ...
- ios版弹珠游戏源码
这个是我们比较喜欢玩的一直小游戏的,ios版弹珠游戏源码,该游戏源码来着IOS教程网其他网友提供上传的,大家可以了解一下吧. nore_js_op> <ignore_js_op&g ...
- zzulioj--1790-- 弹珠游戏(数学水题!)
弹珠游戏 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 14 Solved: 10 SubmitStatusWeb Board Descriptio ...
- 洛谷OJ P2356 弹珠游戏 维护前缀和
题目描述 Description MedalPluS 和他的小伙伴 NOIRP 发掘了一个骨灰级别的游戏--超级弹珠. 游戏的内容是:在一个 n*n 的矩阵里,有若干个敌人,你的弹珠可以摧毁敌人,但只 ...
随机推荐
- arcgis engine 监听element的添加、更新和删除事件(使用IGraphicsContainerEvents)
IGraphicsContainerEvents Interface 如何监听 element事件? 如,当我们在Mapcontrol上添加.删除.更新了一个Element后,如何捕捉到这个事件? ...
- TypedReference
http://stackoverflow.com/questions/4764573/why-is-typedreference-behind-the-scenes-its-so-fast-and-s ...
- 简述block
block传值也适用于从后往前传值 先介绍block的基本知识 /** * 1.如何定义一个Block变量 2.怎样给定义的Block变量赋初值 3.如何冲定义Block类型 4.如何使用Block实 ...
- [Fluent NHibernate]第一个程序
目录 写在前面 Fluent Nhibernate简介 基本配置 总结 写在前面 在耗时两月,NHibernate系列出炉这篇文章中,很多园友说了Fluent Nhibernate的东东,也激起我的兴 ...
- 10 件有关 JavaScript 让人费解的事情
JavaScript 可算是世界上最流行的编程语言,它曾被 Web 开发设计师贴上噩梦的标签,虽然真正的噩梦其实是 DOM API,这个被大量的开发与设计师随手拈来增强他们的 Web 前端的脚本语言, ...
- 使用excel计算指数平滑和移动平均
指数平滑法 原数数据如下: 点击数据——数据分析 选择指数平滑 最一次平滑 由于我们选择的区域是B1:B22,第一个单元格“钢产量”,被当做标志,所以我们应该勾选标志.当我们勾选了标志后,列中的第 ...
- [Data Structure & Algorithm] 八大排序算法
排序有内部排序和外部排序之分,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.我们这里说的八大排序算法均为内部排序. 下图为排序 ...
- PHP如何获取Post请求中的Json字符串数据?
摘自:http://dianjingjiaoyu.blog.163.com/blog/static/18347920820114194642257/ 最近用到ext与PHP交互,ext把json数据p ...
- 【Android学习】android布局中几个距离单位的区别:px、dp、sp
一.px 像素,我们经常说的400*800这种的就是像素,这个比较好理解. 二.dp 要理解dp,首先要先引入dpi这个概念,dpi全称是dots per inch,对角线每英寸的像素点的个数,所以, ...
- JAVA的i++, i+=1, i=i+1有区别吗?
看一些JAVA基础题的时候,经常看到这个问题,很多人的解释是:i++最快,i+=1其次,i=i+1最慢.下面通过Sun JDK编译出来的字节码验证一下这个问题. 为了让编译出来的字节码便于阅读,将这三 ...