写到一半才发现能够用双向搜索4层来写,但已经不愿意改了,干脆暴搜+剪枝水过去算了。

想到一个非常水的剪枝,h函数为  当前点到终点4个点的最短距离加起来除以2。由于最多一步走2格,然后在HDU上T了,又发现再搜索过程中。这个估价函数应该是递减的(贪心),再加上这个剪枝就过了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<list>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
#define stop system("pause")
struct node
{
int x,y;
}a[4],b[4];
int dx[]={0,0,-1,1};
int dy[]={-1,1,0,0};
bool no(int x,int y)
{
for(int i=0;i<4;i++)
if(a[i].x==x&&a[i].y==y)
return false;
return true;
}
bool isok(int x,int y)
{
return x>=1&&x<=8&&y>=1&&y<=8;
}
bool ed[9][9];
int h()
{
int cnt=0;
for(int i=0;i<4;i++)
{
int mi=10000;
for(int j=0;j<4;j++)
{
mi=min(mi,abs(a[i].x-b[j].x)+abs(a[i].y-b[j].y));
}
cnt+=mi;
}
return cnt;
}
bool dfs(int dis,int last)
{
int t=h();
if(t==0) return true;
t/=2;
if(dis+t>=8||t>last) return false;
for(int i=0;i<4;i++)
{
for(int d=0;d<4;d++)
{
if(isok(a[i].x+dx[d],a[i].y+dy[d]))
{
if(no(a[i].x+dx[d],a[i].y+dy[d]))
{
a[i].x+=dx[d];
a[i].y+=dy[d];
if(dfs(dis+1,t)) {return true;}
a[i].x-=dx[d];
a[i].y-=dy[d];
}
else if(isok(a[i].x+2*dx[d],a[i].y+2*dy[d])&&no(a[i].x+2*dx[d],a[i].y+2*dy[d]))
{
a[i].x+=2*dx[d];
a[i].y+=2*dy[d];
if(dfs(dis+1,t)) {return true;}
a[i].x-=2*dx[d];
a[i].y-=2*dy[d];
}
}
}
}
return false;
}
int main()
{
int x,y;
while(~scanf("%d%d",&a[0].x,&a[0].y))
{
memset(ed,0,sizeof(ed));
for(int i=1;i<4;i++) scanf("%d%d",&a[i].x,&a[i].y);
for(int i=0;i<4;i++) scanf("%d%d",&b[i].x,&b[i].y),ed[b[i].x][b[i].y]=true;
if(dfs(0,10000)) puts("YES");
else puts("NO");
}
return 0;
}

poj 1198 hdu 1401 搜索+剪枝 Solitaire的更多相关文章

  1. POJ 1198 / HDU 1401 Solitaire (记忆化搜索+meet in middle)

    题目大意:给你一个8*8的棋盘,上面有四个棋子,给你一个初始排布,一个目标排布,每次移动,可以把一个棋子移动到一个相邻的空位,或者跨过1个相邻的棋子,在保证棋子移动不超过8次的情况下,问能否把棋盘上的 ...

  2. POJ 1198/HDU 1401

    双向广搜... 呃,双向广搜一般都都用了HASH判重,这样可以更快判断两个方向是否重叠了.这道题用了双向的BFS,有效地减少了状态.但代码太长了,不写,贴一个别人的代码.. #include<i ...

  3. hdu 5887 搜索+剪枝

    Herbs Gathering Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  4. hdu 4848 搜索+剪枝 2014西安邀请赛

    http://acm.hdu.edu.cn/showproblem.php?pid=4848 比赛的时候我甚至没看这道题,事实上不难.... 可是说实话,如今对题意还是理解不太好...... 犯的错误 ...

  5. POJ 1011 Sticks(搜索 && 剪枝 && 经典)

    题意 : 有n根木棍(n<=64),它们由一些相同长度的木棍切割而来,给定这n根木棍的长度,求使得原来长度可能的最小值. 分析 : 很经典的深搜题目,我们发现答案只可能是所有木棍长度总和的因数, ...

  6. hdu 6196 搜索+剪枝

    Today, Bob plays with a child. There is a row of n numbers. One can takes a number from the left sid ...

  7. HDU 1401 Solitaire 双向DFS

    HDU 1401 Solitaire 双向DFS 题意 给定一个\(8*8\)的棋盘,棋盘上有4个棋子.每一步操作可以把任意一个棋子移动到它周围四个方向上的空格子上,或者可以跳过它四个方向上的棋子(就 ...

  8. hdu 5469 Antonidas(树的分治+字符串hashOR搜索+剪枝)

    题目链接:hdu 5469 Antonidas 题意: 给你一颗树,每个节点有一个字符,现在给你一个字符串S,问你是否能在树上找到两个节点u,v,使得u到v的最短路径构成的字符串恰好为S. 题解: 这 ...

  9. 搜索+剪枝——POJ 1011 Sticks

    搜索+剪枝--POJ 1011 Sticks 博客分类: 算法 非常经典的搜索题目,第一次做还是暑假集训的时候,前天又把它翻了出来 本来是想找点手感的,不想在原先思路的基础上,竟把它做出来了而且还是0 ...

随机推荐

  1. 基于redis的cas集群配置(转)

    1.cas ticket统一存储 做cas集群首先需要将ticket拿出来,做统一存储,以便每个节点访问到的数据一致.官方提供基于memcached的方案,由于项目需要,需要做计入redis,根据官方 ...

  2. android程序中使用命令行及获得命令行执行后的内容

    在开发android项目中,需要在程序中使用命令行执行,获得命令行执行后的结果并做处理. 下面是自己写的一个小例子,供以后参考使用: public String android_command(){ ...

  3. Android剪切板(ClipboardManager) 复制文本

    Android也有剪切板(ClipboardManager) 注意:导包的时候 API 11之前:  android.text.ClipboardManagerAPI 11之后:  android.c ...

  4. 在屏幕上建立ALV

    在屏幕上创建两个文本元素空件.一个推出按钮控件.一个定制控制按钮 代码所示: *&------------------------------------------------------- ...

  5. Photon的使用

    这几个月给公司一个正在做的半吊子游戏加pvp功能,一个人居然要2个多月弄个 PVP  类似 Dota 对战的游戏.我手里有套现成搭建服务端架构都没敢用起来,这服务器还是太初步了,只是验证了 Boost ...

  6. UVA 116 Unidirectional TSP(dp + 数塔问题)

     Unidirectional TSP  Background Problems that require minimum paths through some domain appear in ma ...

  7. Codeforces Round #257 (Div. 2) B Jzzhu and Sequences

    Jzzhu has invented a kind of sequences, they meet the following property: You are given x and y, ple ...

  8. Swift - 使用UIWebView和UIToolbar制作一个浏览器

    使用网页控件(UIWebView)与工具栏控件(UIToolbar),我们可以自制一个小型的浏览器,其功能如下: 1,输入网址,点击“Go”按钮加载网页 2,加载过程中有进度条,同时可以点击停止按钮取 ...

  9. WebGL自学教程——WebGL演示样本:开始

    最终开始WebGL样品演示,...... 开始 使用WebGL步骤,非常easy: 1. 获得WebGL的渲染环境(也叫渲染上下文). 2. 发挥你的想象力,利用<WebGL參考手冊>中的 ...

  10. 300M无线路由器 TL-WR842N - TP-LINK官方网站

    300M无线路由器 TL-WR842N - TP-LINK官方网站 300M无线路由器TL-WR842N 11N无线技术.300Mbps无线速率 2x2MIMO架构.CCA技术,提升无线稳定性.扩大无 ...