题意:从(0.0)点出发,第一次走一步……第k次走k步,且每次必须转90度,不能走重复的点。求k次后回到出发点的所有情况。按最小字典序从小到大输出。

思路:

把所有坐标+220,保证其是正数,然后搜索。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
#include <algorithm>
typedef long long ll;
using namespace std;
const int inf = 0x3f3f3f3f;
int tx[100];
int ty[100];
int dir[4][2] = {{1,0},{0,1},{0,-1},{-1,0}};
int vis[1000][1000];
char dire[] = {"ensw"};
int all;
struct node
{
int step;
int x,y;
int dir;
};
int n,k;
int ans[200]; bool judge(int i,node a) //判断是否能走
{
int x = a.x+dir[i][0]*(a.step+1);
int y = a.y+dir[i][1]*(a.step+1);
if(i == 1 || i == 2)
{
for(int j = 0; j < k; j++)
{
if(tx[j] == x && ty[j] >= y && ty[j] <= a.y && i == 2)
return true;
if(tx[j] == x && ty[j] >= a.y && ty[j] <= y && i == 1)
return true;
}
}
if(i == 0 || i == 3)
{
for(int j = 0; j < k; j++)
{
if(ty[j] == y && tx[j] >= x && tx[j] <= a.x && i == 3)
return true;
if(ty[j] == y && tx[j] >= a.x && tx[j] <= x && i == 0)
return true;
}
}
return false;
} void dfs(node a)
{
if(a.x == 220 && a.y == 220 && a.step == n)
{
// printf("%d\n",a.step);
// for(int i = 0; i < a.step;i++)
// printf("%d ",ans[i]);
// printf("\n");
for(int i = 0; i < a.step; i++)
{
printf("%c",dire[ans[i]]);
}
printf("\n");
all++;
return ;
}
if(a.step >= n)
return; for(int i = 0; i < 4; i++)
{
if(i == 0 && (a.dir == 3||a.dir == 0))continue;
if(i == 1 && (a.dir == 2||a.dir == 1))continue;
if(i == 2 && (a.dir == 1||a.dir == 2))continue;
if(i == 3 && (a.dir == 0||a.dir == 3))continue; if(judge(i,a))
continue;
node tt = a;
ans[a.step] = i;
tt.x = a.x+dir[i][0]*(a.step+1);
tt.y = a.y+dir[i][1]*(a.step+1);
if(vis[tt.x][tt.y])
continue;
vis[tt.x][tt.y] = 1;
tt.dir = i;
tt.step = a.step + 1;
dfs(tt);
vis[tt.x][tt.y] = 0;
}
return ;
} int main()
{
int cas = 1,T;
int a,b;
scanf("%d ",&T);
while(T--)
{
scanf("%d %d ",&n,&k);
memset(vis,0,sizeof(vis));
for(int i = 0; i < k; i++)
{
scanf("%d %d",&a,&b);
tx[i] = a+220;
ty[i] = b+220;
}
node cur;
all = 0;
cur.x = 220,cur.y = 220,cur.step = 0,cur.dir = -1;
dfs(cur);
printf("Found %d golygon(s).\n",all);
printf("\n");
}
return 0;
}

  

习题 7-2 uva225(回溯)的更多相关文章

  1. uva225 回溯剪枝

    这道题要剪枝,不然会超时,还有就是每次参加过的城市下次不能再参观,不然会WA. 对于障碍物的坐标我用了两种方法,第一种就是直接用STL里面的set,对于判断是否访问过直接用的count,用时960ms ...

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

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

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

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

  4. 算法(第四版)C# 习题题解——2.4

    写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 查找更方便的版本见:https ...

  5. 数据结构与算法分析:C语言描述(原书第2版 简体中文版!!!) PDF+源代码+习题答案

    转自:http://www.linuxidc.com/Linux/2014-04/99735.htm 数据结构与算法分析:C语言描述(原书第2版中文版!!!) PDF+源代码+习题答案 数据结构与算法 ...

  6. 【笔记】《算法竞赛入门》习题7-3 UVa211_多米诺效应

    title: 习题7-3 UVa211_多米诺效应 date: 2021-01-29 19:08:00 categories: 算法竞赛入门 tags: 数据结构 算法 UVa 题目: 使用28个多米 ...

  7. N皇后问题—初级回溯

    N皇后问题,最基础的回溯问题之一,题意简单N*N的正方形格子上放置N个皇后,任意两个皇后不能出现在同一条直线或者斜线上,求不同N对应的解. 提要:N>13时,数量庞大,初级回溯只能保证在N< ...

  8. jQuery 2.0.3 源码分析 回溯魔法 end()和pushStack()

    了解了jQuery对DOM进行遍历背后的工作机制,可以在编写代码时有意识地避免一些不必要的重复操作,从而提升代码的性能 从这章开始慢慢插入jQuery内部一系列工具方法的实现 关于jQuery对象的包 ...

  9. Sharepoint学习笔记—习题系列--70-576习题解析 --索引目录

        Sharepoint学习笔记—习题系列--70-576习题解析  为便于查阅,这里整理并列出了70-576习题解析系列的所有问题,有些内容可能会在以后更新. 需要事先申明的是:     1. ...

随机推荐

  1. AWS EC2服务器的HTTPS负载均衡器配置过程

    AWS EC2服务器配置负载均衡器步骤:   1.普通负载均衡器   至少两台EC2实例,这里以Centos6.7系统为例 启动之后先安装个apache的httpd服务器默认80端口,或者使用其他服务 ...

  2. JAVA线程池原理详解(1)

    线程池的优点 1.线程是稀缺资源,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以重复使用. 2.可以根据系统的承受能力,调整线程池中工作线程的数量,防止因为消耗过多内存导致服务器崩溃. 线 ...

  3. 解决java.lang.NoSuchMethodError:org.joda.time.DateTime.withTimeAtStartOfDay() Lorg/joda/time/DateTime

    问题:项目放在weblogic运行,报错 java.lang.NoSuchMethodError: org.joda.time.DateTime.withTimeAtStartOfDay()Lorg/ ...

  4. OpenGL中怎么把世界坐标系变成屏幕坐标系

    对这个3D坐标手动进行OpenGL的四个变换,得到的结果就是屏幕上的像素坐标.前三个变换(Model, View, Projection)都是4x4矩阵,操作对象是四维向量,所以需要把(100, 10 ...

  5. dede观看总结自己总结

    知识点一:{dede:arclist channelid="18" addfields="language,pfz" limit="0,5" ...

  6. 用‘+=’拼接字符串,打印时总会出现一个undefined

    var str; for(var i = 0; i < 5; i++){ str += String(i); } console.log(str); 他喵的,打印的结果竟然是"unde ...

  7. HTTP协议扫盲(六)InputStream的复用

    一.问题提出 在进行网关引擎开发时,获取到一个http请求的inputstream后,可能要多次利用它进行read操作.由于流读过一次就不能再读了,所以需要实现InputStream的复制. 而Inp ...

  8. cv2.cornerHarris()详解 python+OpenCV 中的 Harris 角点检测

    参考文献----------OpenCV-Python-Toturial-中文版.pdf 参考博客----------http://www.bubuko.com/infodetail-2498014. ...

  9. oracle11.2中分区功能测试之add&amp;split partition对global&amp;local index的影响

    生产库中某些大表的分区异常,需要对现有表进行在线操作,以添加丢失分区,因为是生产库,还是谨慎点好,今天有空,针对add&split分区对global&local索引的影响进行了测试,测 ...

  10. 超级好用的前端开发测试Chrome插件-基于REST的Web服务客户端

    基于REST的Web服务客户端是一款功能强大的谷歌浏览器插件,使用基于REST的Web服务客户端(模拟REST客户端)可以让用户使用谷歌浏览器模拟REST请求来测试REST风格. 基于REST的Web ...