UVA225 Golygons 黄金图形(dfs+回溯)
剪枝1:在同一个维度上的点具有相同的奇偶性,如果奇数数量只有奇数个那么一定不能返回原点。
剪枝2:当前位置怎么也走不回去。
3:沿途判断障碍即可。
在oj上提交0.347s,最快的0.012s,应该有更好的做法。
#include<bits/stdc++.h> const char *bin = "ensw";
const int dx[] = {,, ,-};
const int dy[] = {,,-, }; const int maxn = ;//1+...20
const int o = ;
const int N = ;
const int nxt_dir[][] = {{,},{,},{,},{,},{,,,}};
const int deg[] = {,,,,};
int vis[maxn][maxn];
int n;
int sum[N];
int left[N];
int path[N];
int cnt;
void dfs(int x,int y,int d,int dir)
{
if(d++ == n ){
if(x == o && y == o){
for(int i = ; i < n; i++){
printf("%c",bin[path[i]]);
}
putchar('\n');
cnt++;
}
return ;
}
for(int i = ; i < deg[dir]; i++){
int j = nxt_dir[dir][i];
int nx = x+dx[j]*d, ny = y+dy[j]*d;
if(vis[nx][ny]) continue;
if(abs(nx-o) + abs(ny-o) > left[d]) continue;
bool flag = false;
if(j == || j == ){
for(int tx = x+dx[j]; tx != nx ; tx+=dx[j]){
if(!~vis[tx][y]) {flag = true; break;}
}
}else {
for(int ty = y+dy[j]; ty != ny ; ty+=dy[j]){
if(!~vis[x][ty]) {flag = true; break;}
}
}
if(flag) continue;
path[d-] = j;
vis[nx][ny] = ;
dfs(nx,ny,d,j);
vis[nx][ny] = ;
}
} int main()
{
// freopen("in.txt","r",stdin);
int T;
scanf("%d",&T);
for(int i = ; i < N; i++)
sum[i] = sum[i-]+i;
while(T--){
int k;
scanf("%d%d",&n,&k);
if(((n>>)&)^(n&)) { printf("Found 0 golygon(s).\n\n"); continue; }
int tx,ty;
memset(vis,,sizeof(vis));
for(int i = ; i < k; i++){
scanf("%d%d",&tx,&ty);
if(abs(tx)<o && abs(ty)<o ) vis[tx+o][ty+o] = -;
}
for(int i = ; i < n; i++)
left[i] = sum[n] - sum[i];
cnt = ;
dfs(o,o,,);
printf("Found %d golygon(s).\n\n",cnt);
}
return ;
}
UVA225 Golygons 黄金图形(dfs+回溯)的更多相关文章
- UVA - 225 Golygons (黄金图形)(回溯)
题意:平面有k个障碍点.从(0,0)出发,第一次走1个单位,……,第n次走n个单位,恰好回到(0,0),每次必须转弯90°,图形可以自交,但不能经过障碍点.按字典序输出所有移动序列,并输出序列总数. ...
- UVa 225 黄金图形(回溯+剪枝)
https://vjudge.net/problem/UVA-225 题意:平面上有k个障碍点,从(0,0)出发,第一次走1个单位,第二次走2个单位,...第n次走n个单位,最后恰好回到(n,n).每 ...
- 素数环(dfs+回溯)
题目描述: 输入正整数n,把整数1,2...n组成一个环,使得相邻两个数和为素数.输出时从整数1开始逆时针排列并且不能重复: 例样输入: 6 例样输出: 1 4 3 2 5 6 1 6 5 2 3 4 ...
- NOJ 1074 Hey Judge(DFS回溯)
Problem 1074: Hey Judge Time Limits: 1000 MS Memory Limits: 65536 KB 64-bit interger IO format: ...
- HDU 1016 Prime Ring Problem(经典DFS+回溯)
Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- HDU 2181 哈密顿绕行世界问题(经典DFS+回溯)
哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU1016 Prime Ring Problem(DFS回溯)
Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- uva 193 Graph Coloring(图染色 dfs回溯)
Description You are to write a program that tries to find an optimal coloring for a given graph. Col ...
- P1074 靶形数独 dfs回溯法
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“靶 ...
随机推荐
- php+redis实现高并发模拟下单、秒杀、抢购操作
对于高并发下的场景,一般都是采用redis缓存机制来处理. 当然也不是只有redis可以处理.还有利用mysql事务操作锁住操作的行.文件锁. 不过这些方式都没有redis缓存高效.可靠. 模拟的过程 ...
- UVA - 13022 Sheldon Numbers(位运算)
UVA - 13022 Sheldon Numbers 二进制形式满足ABA,ABAB数的个数(A为一定长度的1,B为一定长度的0). 其实就是寻找在二进制中满足所有的1串具有相同的长度,所有的0串也 ...
- koa-router 路由参数与前端路由的结合
koa-router 定制路由时支持通过冒号形式在 url 中指定参数,该参数会挂载到 context 上然后可通过 context.params.paramName 方便地获取. 考察下面的示例: ...
- 【转】mysql中set autocommit=0与start transaction的关系
在mysql中用户的任何一个更新操作(写操作)都被视为一个事务,set autocommit=0指事务非自动提交,自此句执行以后,每个SQL语句或者语句块所在的事务都需要显示"commit& ...
- js组件化(转载)
今天想着开始封装自己的UI库和组件库,从网上看到一篇很好的关于js组件化的文章,现在分享一下. 转载地址:https://blog.csdn.net/Prince_fmx/article/detail ...
- axios 跨域配置
axios跨域设置 找到项目config文件夹下的index.js文件,将dev中的proxyTable项中添加配置 proxyTable: { '/api': { target: 'https:// ...
- es6入门5--class类的基本用法
在ES6之前,准确来说JavaScript语言并无类的概念,却有模拟类的做法.相比在类似java这类传统面向对象语言中通过类来生成实例,js则通过构造函数模拟类来生成实例. 这是因为在JS设计初期,作 ...
- DOM的学习网站 DOM是HTML和XML的编程接口
- Educational Codeforces Round 65 (Rated for Div. 2) A. Telephone Number
链接:https://codeforces.com/contest/1167/problem/A 题意: A telephone number is a sequence of exactly 11 ...
- Codeforces Round #561 (Div. 2) C. A Tale of Two Lands
链接:https://codeforces.com/contest/1166/problem/C 题意: The legend of the foundation of Vectorland talk ...