题意:从(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. java实现同步的两种方式

    同步是多线程中的重要概念.同步的使用可以保证在多线程运行的环境中,程序不会产生设计之外的错误结果.同步的实现方式有两种,同步方法和同步块,这两种方式都要用到synchronized关键字. 给一个方法 ...

  2. vivado License导入方法与资源获取

    前言 以下安装说明基于已经正确安装vivado 笔者操作环境:linux vivado版本:2015.2 vivado License导入方法: 点击菜单栏[Help],选择[Manage Licen ...

  3. 基于协程的Python网络库gevent

    import gevent def test1(): print 12 gevent.sleep(0) print 34 def test2(): print 56 gevent.sleep(0) p ...

  4. Android网络传输中必用的两个加密算法:MD5 和 RSA 及Base64加密总结

    (1)commons-codec包简介 包含一些通用的编码解码算法.包括一些语音编码器,Hex,Base64.MD5 一.md5.base64.commons-codec包 commons-codec ...

  5. 【iOS】swift 枚举

    枚举语法 你可以用enum开始并且用大括号包含整个定义体来定义一个枚举: enum SomeEnumeration { // 在这里定义枚举 } 这里有一个例子,定义了一个包含四个方向的罗盘: enu ...

  6. 偶遇vue-awesome-swiper的坑

    最近用vue重构一个移动端的项目,碰到了不少坑,今天拿移动端最著名的轮播插件swiper为例来说,由于这个项目没用UI库,纯手写的样式,沿用老的插件,自然而然的选择了vue-awesome-swipe ...

  7. 20170222==(MODBUS读取多个寄存器)

    MODBUS读取多个寄存器(功能码04) 为了简单我这里只用4个寄存器,当让你也可以用125个寄存器,但是最多也只能用125个寄存器的.每个寄存器有上面的表知道为一个字的大小即2个字节或者叫16比特位 ...

  8. js控制表格实时编辑

    点击添加,在表格的最后一行添加一行表单元素,右侧按钮变为保存和取消.(点击保存,数据用ajax无刷新添加到界面,点击取消,取消此行的添加.)点击编辑,在本行改为表单,带有原来的值,右侧按钮变为确认和取 ...

  9. Jetty入门(1-2)eclipse集成jetty插件并发布运行应用

    一.eclipse集成jetty插件 1.从市场安装jetty插件 2.使用jetty插件发布应用和配置运行环境 debug配置默认共用上述run配置 3.使用jetty插件启动运行和停止运行选中的应 ...

  10. python 面向对象进阶之内置方法

    一 isinstance(obj,cls)和issubclass(sub,super) 1.1,isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(obj ...