UVa 225 黄金图形(回溯+剪枝)
https://vjudge.net/problem/UVA-225
题意:
平面上有k个障碍点,从(0,0)出发,第一次走1个单位,第二次走2个单位,...第n次走n个单位,最后恰好回到(n,n)。每次必须转弯90°。
思路:
首先要注意的是坐标有可能是负的,所以在这里我们可以障碍点的坐标值+105变成正值,原点也就变成了(105,105),为什么是加105呢?因为我们最多走20步,最远是310,所以如果大于了105,之后肯定就回不来了,所以只需要加上105就可以了。
然后就是各种剪枝了,比较重要的就是当前距离大于剩余可走距离时,之后不管怎么走,肯定是回不到原点了,此时剪枝。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std; const int maxn = ;
int n, k, cnt;
const int dir[][] = { { , }, { , }, { , - }, { -, } };
const char dict[] = "ensw";
int G[*maxn][*maxn];
int vis[*maxn][*maxn];
int path[maxn];
int sum[]; void init()
{
//计算步数
sum[] = ;
for (int i = ; i <= ; i++)
sum[i] = sum[i - ] + i;
} bool judge(int x, int y,int d)
{
int dis = abs(x - ) + abs(y - );
if (dis > sum[n] - sum[d]) return false;
return true;
} void dfs(int f, int d, int x, int y)
{
if (d == n)
{
if (x!= || y!=) return;
for (int i = ; i < n; i++)
printf("%c", dict[path[i]]);
printf("\n");
cnt++;
return;
} for (int k = ; k < ; k++)
{
if (k == f || k + f == ) continue;
int dx = x;
int dy = y;
int flag = ;
for (int i = ; i <= d + ; i++)
{
dx = dx + dir[k][];
dy = dy + dir[k][];
if (G[dx][dy]||!judge(dx,dy,d)) { flag = ; break; }
}
if (flag && !vis[dx][dy])
{
vis[dx][dy] = ;
path[d] = k;
dfs(k, d + , dx, dy);
vis[dx][dy] = ;
}
}
return;
} int main()
{
//ios::sync_with_stdio(false);
//freopen("D:\\txt.txt", "r", stdin);
int T;
init();
scanf("%d", &T);
while (T--)
{
scanf("%d%d",&n, &k);
memset(G, , sizeof(G));
memset(vis, , sizeof(vis));
for (int i = ; i < k; i++)
{
int a, b;
scanf("%d%d", &a, &b);
a += ;
b += ;
if (a>= && b>=) G[a][b] = ;
}
cnt = ;
dfs(-, , , );
printf("Found %d golygon(s).\n\n", cnt);
}
}
UVa 225 黄金图形(回溯+剪枝)的更多相关文章
- 回溯剪枝,dfs,bfs
		
dfs: 给定一个整数n,将数字1~n排成一排,将会有很多种排列方法. 现在,请你按照字典序将所有的排列方法输出. 输入格式 共一行,包含一个整数n. 输出格式 按字典序输出所有排列方案,每个方案占一 ...
 - HDU 5113 Black And White 回溯+剪枝
		
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5113 Black And White Time Limit: 2000/2000 MS (Java/ ...
 - HDU 2553 N皇后问题(回溯 + 剪枝)
		
本文链接:http://i.cnblogs.com/EditPosts.aspx?postid=5398797 题意: 在N*N(N <= 10)的方格棋盘放置了N个皇后,使得它们不相互攻击(即 ...
 - HDU1010 Tempter of the Bone(回溯 + 剪枝)
		
本文链接:http://i.cnblogs.com/EditPosts.aspx?postid=5398734 题意: 输入一个 N * M的迷宫,这个迷宫里'S'代表小狗的位置,'X'代表陷阱,‘D ...
 - HDU1016 Prime Ring Problem (回溯 + 剪枝)
		
本文链接:http://www.cnblogs.com/Ash-ly/p/5398684.html 题意: 给你一个数字N(N <= 20),要求你把这N个数组成一个环,环内的数字不能重复,左右 ...
 - UVA - 225 Golygons (黄金图形)(回溯)
		
题意:平面有k个障碍点.从(0,0)出发,第一次走1个单位,……,第n次走n个单位,恰好回到(0,0),每次必须转弯90°,图形可以自交,但不能经过障碍点.按字典序输出所有移动序列,并输出序列总数. ...
 - UVa 208 - Firetruck 回溯+剪枝 数据
		
题意:构造出一张图,给出一个点,字典序输出所有从1到该点的路径. 裸搜会超时的题目,其实题目的数据特地设计得让图稠密但起点和终点却不相连,所以直接搜索过去会超时. 只要判断下起点和终点能不能相连就行了 ...
 - UVA225 Golygons 黄金图形(dfs+回溯)
		
剪枝1:在同一个维度上的点具有相同的奇偶性,如果奇数数量只有奇数个那么一定不能返回原点. 剪枝2:当前位置怎么也走不回去. 3:沿途判断障碍即可. 在oj上提交0.347s,最快的0.012s,应该有 ...
 - [算法专题] 深度优先搜索&回溯剪枝
		
1. Palindrome Partitioning https://leetcode.com/problems/palindrome-partitioning/ Given a string s, ...
 
随机推荐
- #if的使用说明
			
#if的后面接的是表达式 #if (MAX==10)||(MAX==20) code... #endif 它的作用是:如果(MAX==10)||(MAX==20)成立,那么编译器就会把其中的#if 与 ...
 - [py][mx]operation模型设计
			
用户表 UserMesasage 用户消息 UserFavorite 用户收藏 UserAsk 用户咨询 UserCourse 用户学习的课程 CourseComments 用户评论 收藏有3种类型 ...
 - UUID生成字符串
			
在向数据库插入新数据时,可能需要插入字符串形式的ID,这时使用UUID可以生成随机字符串: String str = UUID.randomUUID().toString();
 - [LeetCode] 694. Number of Distinct Islands
			
Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...
 - 大神的博客地址liferay
			
http://www.huqiwen.com/category/technology-share/liferay/
 - Object之clone
			
一.Object类中clone的实现. 二.clone详解. 看,clone()方法又是一个被声明为native的方法,因此,我们知道了clone()方法并不是Java的原生方法,具体的实现是有C/C ...
 - Asp.net Mvc5的认识
			
前言:以前总说自己玩mvc,但是对mvc的认识还是不够透彻,也没有好好看微软自带的mvc项目中的精妙,最近闲了下来,好好看了看. 通过上图,我们可以清晰地了解到MVC 5应用程序的项目结构,接下来我们 ...
 - 文本按列导入excel
			
打开excel,选择数据选项卡,自文本选项.
 - Python 面向对象教程
			
总结:函数式的应用场景 –> 各个函数之间是独立且无共用的数据. 面向对象三大特性 面向对象的三大特性是指:封装.继承和多态. 一.封装 封装,顾名思义就是将内容封装到某个地方,以后再去调用被封 ...
 - python 模拟windows键盘按键的封装
			
代码:在执行的时候,把光标放在指定的地方,在此例中,点击运行后把光标放到结果区域,粘贴的时候是粘贴到光标所在的问题,如过是运行脚本在web元素输入框中输入的话,不能移动光标到其他位置 #encodin ...