Problem UVA225-Golygons

Accept:307  Submit:3646

Time Limit: 3000 mSec

 Problem Description

Imagine a country whose cities have all their streets laid out in a regular grid. Now suppose that a tourist with an obsession for geometry is planning expeditions to several such cities.
Starting each expedition from the central cross-roads of a city, the intersection labelled (0,0), our mathematical visitor wants to set off north, south, east or west, travel one block, and view the sights at the intersection (0,1) after going north, (0,-1) after going south, (1,0) after going east or (-1,0) after going west. Feeling ever more enthused by the regularity of the city, our mathematician would like to walk a longer segment before stopping next, going two blocks. What’s more, our visitor doesn’t want to carry on in the same direction as before, nor wishes to double back, so will make a 90o turn either left or right. The next segment should be three blocks, again followed by a right-angle turn, then four, five, and so on with ever-increasing lengths until finally, at the end of the day, our weary traveller returns to the starting point, (0,0).
The possibly self-intersecting figure described by these geometrical travels is called a golygon.
Unfortunately, our traveller will making these visits in the height of summer when road works will disrupt the stark regularity of the cities’ grids. At some intersections there will be impassable obstructions. Luckily, however, the country’s limited budget means there will never be more than 50 road works blocking the streets of any particular city. In an attempt to gain accountability to its citizens, the city publishes the plans of road works in advance. Our mathematician has obtained a copy of these plans and will ensure that no golygonal trips get mired in molten tar.
Write a program that constructs all possible golygons for a city.

 Input

Since our tourist wants to visit several cities, the input file will begin with a line containing an integer specifying the number of cities to be visited.
For each city there will follow a line containing a positive integer not greater than 20 indicating the length of the longest edge of the golygon. That will be the length of the last edge which returns the traveler to (0,0). Following this on a new line will be an integer from 0 to 50 inclusive which indicates how many intersections are blocked. Then there will be this many pairs of integers, one pair per line, each pair indicating the x and y coordinates of one blockage.

 Output

For each city in the input, construct all possible golygons. Each golygon must be represented by a sequence of characters from the set {n,s,e,w} on a line of its own. Following the list of golygons should be a line indicating how many solutions were found. This line should be formatted as shown in the example output. A blank line should appear following the output for each city.
Note: See on the right the diagram of the 1st City

 Sample Input

2 8 2 -2 0 6 -2 8 2 2 1 -2 0
 

 Sample Ouput

wsenenws

Found 1 golygon(s).

Found 0 golygon(s).

题解:很明显的dfs搜索,剪枝也很粗暴,如果剩下的步数不足以回到原点就返回。由于坐标可能是负的,因此原点坐标要取成一个足够大的正值。

坑点:题目中没有说一个城市只能参观一次,但是实际上只能参观一次,需要vis数组。

 #include <bits/stdc++.h>

 using namespace std;

 const int o = ,Max = ;

 int n,ans;
int gra[Max][Max];
int dx[] = {,,,-};
int dy[] = {,,-,};
bool vis[Max][Max];
char Direction[] = {'e','n','s','w'};
int sta[],num[] = {,}; //dir为0代表水平方向,为1代表垂直方向 void dfs(int x,int y,int pos,int dir){
//printf("pos:%d x:%d y:%d\n",pos,x,y);
if(pos == n+){
if(x==o && y==o){
ans++;
printf("%c",Direction[sta[]]);
for(int i = ;i <= n;i++){
printf("%c",Direction[sta[i]]);
}
printf("\n");
}
return;
} int step = ;
for(int i = pos;i <= n;i++) step += i;
if(abs(x-o)+abs(y-o) > step) return; if(dir == -){
for(int i = ;i < ;i++){
int xx = x+pos*dx[i],yy = y+pos*dy[i];
if(vis[xx][yy]) continue;
int k;
if(<=i && i<){
for(k = min(y,yy);k <= max(y,yy);k++){
if(gra[xx][k]) break;
}
if(k == max(y,yy)+){
sta[pos] = i;
vis[xx][yy] = true;
dfs(xx,yy,pos+,);
vis[xx][yy] = false;
}
}
else{
for(k = min(x,xx);k <= max(x,xx);k++){
if(gra[k][yy]) break;
}
if(k == max(x,xx)+){
sta[pos] = i;
vis[xx][yy] = true;
dfs(xx,yy,pos+,);
vis[xx][yy] = false;
}
}
}
}
else{
if(dir==){
for(int i = ;i < ;i++){
int xx = x+pos*dx[i],yy = y+pos*dy[i];
if(vis[xx][yy]) continue;
int k;
for(k = min(y,yy);k <= max(y,yy);k++){
if(gra[xx][k]) break;
}
if(k == max(y,yy)+){
sta[pos] = i;
vis[xx][yy] = true;
dfs(xx,yy,pos+,);
vis[xx][yy] = false;
}
}
}
else if(dir==){
for(int j = ;j < ;j++){
int i = num[j];
int xx = x+pos*dx[i],yy = y+pos*dy[i];
if(vis[xx][yy]) continue;
int k;
for(k = min(x,xx);k <= max(x,xx);k++){
if(gra[k][yy]) break;
}
if(k == max(x,xx)+){
sta[pos] = i;
vis[xx][yy] = true;
dfs(xx,yy,pos+,);
vis[xx][yy] = false;
}
}
}
}
} int main()
{
#ifdef GEH
freopen("helloworld.01.inp","r",stdin);
#endif
int iCase;
scanf("%d",&iCase);
while(iCase--){
ans = ;
memset(vis,false,sizeof(vis));
memset(gra,,sizeof(gra));
//vis[o][o] = true;
int k,x,y;
scanf("%d%d",&n,&k);
for(int i = ;i < k;i++){
scanf("%d%d",&x,&y);
if(abs(x)>o || abs(y)>o) continue;
gra[o+x][o+y] = ;
}
dfs(o,o,,-);
printf("Found %d golygon(s).\n\n",ans);
}
return ;
}

UVA225-Golygons(dfs)的更多相关文章

  1. UVA225 Golygons 黄金图形(dfs+回溯)

    剪枝1:在同一个维度上的点具有相同的奇偶性,如果奇数数量只有奇数个那么一定不能返回原点. 剪枝2:当前位置怎么也走不回去. 3:沿途判断障碍即可. 在oj上提交0.347s,最快的0.012s,应该有 ...

  2. UVa225,Golygons

    刘儒家翻译的走出的图形可以自交,不知道大家是怎么理解的,反正我是认为这句话的意思是告诉我允许一个点访问多次 这样是WA的,n=15和n=16时多输出很多数据,应该是不允许自交,也就是不允许一个点访问多 ...

  3. 【习题 7-2 UVA-225】Golygons

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 暴力枚举每次走哪里就好. 用一个二维数组来判重.(数据里,要求不能经过一个点两次->但路径可以相交 然后再用一个flag数组, ...

  4. BZOJ 3083: 遥远的国度 [树链剖分 DFS序 LCA]

    3083: 遥远的国度 Time Limit: 10 Sec  Memory Limit: 1280 MBSubmit: 3127  Solved: 795[Submit][Status][Discu ...

  5. BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]

    1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2221  Solved: 1179[Submit][Sta ...

  6. BZOJ 4196: [Noi2015]软件包管理器 [树链剖分 DFS序]

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1352  Solved: 780[Submit][Stat ...

  7. 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)

    图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则 ...

  8. BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]

    2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2545  Solved: 1419[Submit][Sta ...

  9. POJ_2386 Lake Counting (dfs 错了一个负号找了一上午)

    来之不易的2017第一发ac http://poj.org/problem?id=2386 Lake Counting Time Limit: 1000MS   Memory Limit: 65536 ...

随机推荐

  1. Java集合性能分析-疯狂Java讲义

    一.各Set实现类的性能分析 HashSet和TreeSet是Set的两个典型实现.HashSet的性能总是比TreeSet好(特别是最常用的添加.查询元素等操作),因为TreeSet需要额外的红黑树 ...

  2. vue(四)-vuex与组件联合使用

    官方定义: Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.我的理解就是,vuex就是前端的数据库. 1.首先核心是store,是个仓库,包含着state,因此第一步需要新建一个sto ...

  3. 有状态(Stateful)与无状态(Stateless)

    1.有状态(Stateful): 有数据存储功能.有状态对象(Stateful Bean),就是有实例变量的对象,可以保存数据,类里面有成员变量,而且成员变量是可变的,是非线程安全的.在不同方法调用间 ...

  4. HDU 4764 Stone(巴什博奕)

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

  5. IIS搭建Web服务器,外网可以访问,但无法加载视频

    错误提示如下: 可能原因: IIS的MIME中未注册MP4.ogg.webm相关类型,导致IIS无法识别 解决方法: 在IIS中注册MP4.ogg.webm类型,以下以MP4为例,ogg和webm以此 ...

  6. [vue三部曲]第一部:vue脚手架的搭建和目录资源介绍,超详细!

    第一步 node环境安装 1.1 如果本机没有安装node运行环境,请下载node 安装包进行安装1.2 如果本机已经安装node的运行换,请更新至最新的node 版本下载地址:https://nod ...

  7. 吴恩达机器学习笔记 —— 19 应用举例:照片OCR(光学字符识别)

    http://www.cnblogs.com/xing901022/p/9374258.html 本章讲述的是一个复杂的机器学习系统,通过它可以看到机器学习的系统是如何组装起来的:另外也说明了一个复杂 ...

  8. 支持MPI的hdf5库的编译

    作者:朱金灿 来源:http://blog.csdn.net/clever101 因为最近要研究并行I/O,据说hdf5文件格式可以支持并行I/O,深度学习框架Caffe用的是hdf格式,所以决定把h ...

  9. 13.Odoo产品分析 (二) – 商业板块(6) –采购(3)

    接上一篇  查看Odoo产品分析系列--目录 接上一篇Odoo产品分析 (二) – 商业板块(6) –采购(2) 7. 仓库 仓库是在安装采购管理模块时出现的菜单.用于管理工厂库存,包括已经在手的货物 ...

  10. Floyd算法_MATLAB

    %求图中任意两点之间的最短距离与最短路径 %floyd算法通用程序,输入a为赋权邻接矩阵 %输出为距离矩阵D,和最短路径矩阵path function D=floyd(a) n=size(a,);%行 ...