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 ...
随机推荐
- ShareSDK第三方登陆 (IOS)
1.http://www.mob.com/ 注册申请 2.http://www.mob.com/#/download SDK下载 (简洁版:http://www.mob.com/#/download ...
- Java内部类——成员内部类
成员内部类的意思就是,一个外层类里面包含着一个非static的class,举例如下: class OuterClass { //变量,函数定义... class InnerClass { //变量,函 ...
- WAMPServer 集成环境
1.下载和安装 1.1下载 下载地址:http://www.wampserver.com/en/.由于官方地址是国外的网站可能下载会有些慢,也可以去第三方网站下载 1.2安装 安装文件如下图: 双击安 ...
- HDU3709:Balanced Number(数位DP+记忆化DFS)
Problem Description A balanced number is a non-negative integer that can be balanced if a pivot is p ...
- pygame编写贪吃蛇
一直想用pygame做一个小游戏的,可是因为拖延症的缘故一直没有动,结果那天看到了一个12岁的国际友人小盆友用pygame做的一款塔防游戏,突然感觉已经落后超级远了,所以心血来潮做小游戏了.高中陪伴我 ...
- 第五天学习内容 for循环,嵌套
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...
- Beauty of Array
Description Edward has an array A with N integers. He defines the beauty of an array as the summatio ...
- CABasicAnimation学习Demo 包含了一些经常使用的动画效果
个人写的一些样例: // // ViewController.m // CABasicAnimationDemo // // Created by haotian on 14-6-13. // Cop ...
- clearcase 中一些概念和操作
clearcase 中一些概念和操作 视图 常用命令 ClearCase 安装和使用的一些FAQ 参考 ClearCase具体的说是做配置管理的工具,只是SCM管理工具其中的一种.是RATIONAL公 ...
- OCA读书笔记(8) - 管理用户安全
创建用户:create user +用户 default tablespace + 表空间名 identified + 验证方式 SQL> create user easthome profil ...