poj 1198 hdu 1401 搜索+剪枝 Solitaire
写到一半才发现能够用双向搜索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的更多相关文章
- POJ 1198 / HDU 1401 Solitaire (记忆化搜索+meet in middle)
题目大意:给你一个8*8的棋盘,上面有四个棋子,给你一个初始排布,一个目标排布,每次移动,可以把一个棋子移动到一个相邻的空位,或者跨过1个相邻的棋子,在保证棋子移动不超过8次的情况下,问能否把棋盘上的 ...
- POJ 1198/HDU 1401
双向广搜... 呃,双向广搜一般都都用了HASH判重,这样可以更快判断两个方向是否重叠了.这道题用了双向的BFS,有效地减少了状态.但代码太长了,不写,贴一个别人的代码.. #include<i ...
- hdu 5887 搜索+剪枝
Herbs Gathering Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- hdu 4848 搜索+剪枝 2014西安邀请赛
http://acm.hdu.edu.cn/showproblem.php?pid=4848 比赛的时候我甚至没看这道题,事实上不难.... 可是说实话,如今对题意还是理解不太好...... 犯的错误 ...
- POJ 1011 Sticks(搜索 && 剪枝 && 经典)
题意 : 有n根木棍(n<=64),它们由一些相同长度的木棍切割而来,给定这n根木棍的长度,求使得原来长度可能的最小值. 分析 : 很经典的深搜题目,我们发现答案只可能是所有木棍长度总和的因数, ...
- hdu 6196 搜索+剪枝
Today, Bob plays with a child. There is a row of n numbers. One can takes a number from the left sid ...
- HDU 1401 Solitaire 双向DFS
HDU 1401 Solitaire 双向DFS 题意 给定一个\(8*8\)的棋盘,棋盘上有4个棋子.每一步操作可以把任意一个棋子移动到它周围四个方向上的空格子上,或者可以跳过它四个方向上的棋子(就 ...
- hdu 5469 Antonidas(树的分治+字符串hashOR搜索+剪枝)
题目链接:hdu 5469 Antonidas 题意: 给你一颗树,每个节点有一个字符,现在给你一个字符串S,问你是否能在树上找到两个节点u,v,使得u到v的最短路径构成的字符串恰好为S. 题解: 这 ...
- 搜索+剪枝——POJ 1011 Sticks
搜索+剪枝--POJ 1011 Sticks 博客分类: 算法 非常经典的搜索题目,第一次做还是暑假集训的时候,前天又把它翻了出来 本来是想找点手感的,不想在原先思路的基础上,竟把它做出来了而且还是0 ...
随机推荐
- ubuntu 常用软件
terminator:任意分割控制台 Sublime Text:文本编辑器,也是轻量级的IDE Wireshark:抓包工具 Okular:PDF等文档编辑工具 yEd:流程图等制图软件 Shutte ...
- WinSock - 建立无连接的通信
1.建立一个基于对话框的工程,并在第二步中选择WOSA支持 2.建立客户端 (1)在头文件中添加成员变量 public: CSocket m_clientsocket; (2)每隔一秒钟向服务端发送一 ...
- v$lock 视图访问慢解决方法
V$ 视图访问慢 --解决方法 分析:可能是有数据字典统计信息过久,造成. exec dbms_stats.gather_fixed_objects_stats; ------收集所有数据字典的fix ...
- uva 10196 Check The Check
题目:10196 - Check The Check 思路:水题..模拟 这个代码,前半部分是在数统机房上课的时候写的,挫了点,懒得改了. #include <cstdio> #inclu ...
- Response.Redirect 打开这两种方法的一种新形式
在一般情况下.Response.Redirect 该方法是在server年底转向,因此,除非 Response.Write("<script>window.location='h ...
- ANR的一个实例分析
ANR是android经常出的超时提示,以前看过一个帖子,内容是mediaplayer在release的时候出的ANR,作者也是出了方法,什么加handler之类的. 最后都么有解决,咱们先看看那位同 ...
- 深入分析redis cluster 集群
深入分析redis cluster 集群安装配置详解 下面小编来为各位介绍一篇深入分析redis cluster 集群安装配置详解,如果你希望做数据库集群就可以来看看此文章的哦. http://rub ...
- CArray
CArray是windows下的相当于动态数组的模板类.用起来及其方便,近期由于需要在JNI下的C语言中使用,自己参考CArray类函数,及其自己需要使用到的部分函数用C++实现出来,以供自己使用,在 ...
- PS2: 这篇文章中的图片绘图工具使用的是Dia (sudo apt-get install dia)。据说yEd也很不错。
SBCL编译过程 - O.Nixie的专栏 - 博客频道 - CSDN.NET PS2: 这篇文章中的图片绘图工具使用的是Dia (sudo apt-get install dia).据说yEd也很不 ...
- java--ThreadPool线程池简单用法
package com.threadPool; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent. ...