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 博士拿出了他最近发明的“靶 ...
随机推荐
- js学习笔记2:循环和try/catch/throw
今天学习了js的比较.if/else.switch/case和各种循环,这些东西每种语言都大同小异,没什么好看的,重点说一下js的循环. JavaScript 支持不同类型的循环: for - 循环代 ...
- 用Python分析国民生产总值
今天学习Python的matplotlib,书上的一道例题感觉写的很好(黄红梅的Python数据分析与应用),就是 利用matplotlib的各种图来对2000-2017年季度生产总值进行分析,这道题 ...
- codeforces 547B【单调栈】
题意: 有一个长度为n的序列,序列有长度为1...n的连续子序列, 一个连续子序列里面最小的值称作这个子序列的子序列的strength, 要求出每种长度的连续子序列的最大的strength. 思路: ...
- C# IE环境 - 重置IE(WshShell & Rundll32)
前言 IE问题: 如何重置IE选项? 通过修改注册表,理论上是可行的.前提是你知道重置IE时,有多少注册表项要更改. 如果能直接调用IE的重置设置窗口,并执行重置,能完美重置IE. WshShell ...
- JS高级学习历程-14
昨天内容回顾 1. 面向对象的私有成员.静态成员 私有成员:在构造函数里边定义局部变量,就是私有成员. 静态成员:在js里边,函数就是对象,可以通过给函数对象声明成员方式声明静态成员. 2. 原型继承 ...
- 用jQuery开发插件详解
jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级 ...
- JavaScript基础学习日志(1)——属性操作
JS中的属性操作: 属性操作语法 属性读操作:获取 实例:获取Input值 实例:获取select值 字符串连接 属性写操作:修改.添加 实例:修改value值 实例:添加图片的src地址 inner ...
- scrapy 一些设置和问题
scrapy设置ua池 设置后在setting启用 DOWNLOADER_MIDDLEWARES = { 'laogou.middlewares.LaogouDownloaderMiddleware' ...
- response返回字符床
response.getWriter().println() 本来一个html,JSP等WEB资源返回的就是一个String,只是有时候这个String是符合html格式的,而刚是浏览器接收的了,所以 ...
- kie-api 组件介绍
KieServices:kie整体的入口,可以用来创建Container,resource,fileSystem等 KieContainer: KieContainer就是一个KieBase的容器,可 ...