HDU1401(双向BFS)
题意:http://acm.hdu.edu.cn/showproblem.php?pid=1401
给你8*8的棋盘和4个棋子初始位置、最终位置,问你能否在8次操作后达到该状态。
思路:
双向BFS,起点开始正搜4步,终点倒搜4步,map标记。
#define IOS ios_base::sync_with_stdio(0); cin.tie(0);
#include <cstdio>//sprintf islower isupper
#include <cstdlib>//malloc exit strcat itoa system("cls")
#include <iostream>//pair
#include <fstream>//freopen("C:\\Users\\13606\\Desktop\\Input.txt","r",stdin);
#include <bitset>
//#include <map>
#include<unordered_map>
#include <vector>
#include <stack>
#include <set>
#include <string.h>//strstr substr strcat
#include <string>
#include <time.h>// srand(((unsigned)time(NULL))); Seed n=rand()%10 - 0~9;
#include <cmath>
#include <deque>
#include <queue>//priority_queue<int, vector<int>, greater<int> > q;//less
#include <vector>//emplace_back
//#include <math.h>
#include <cassert>
#include <iomanip>
//#include <windows.h>//reverse(a,a+len);// ~ ! ~ ! floor
#include <algorithm>//sort + unique : sz=unique(b+1,b+n+1)-(b+1);+nth_element(first, nth, last, compare)
using namespace std;//next_permutation(a+1,a+1+n);//prev_permutation
//******************
clock_t __START,__END;
double __TOTALTIME;
void _MS(){__START=clock();}
void _ME(){__END=clock();__TOTALTIME=(double)(__END-__START)/CLOCKS_PER_SEC;cout<<"Time: "<<__TOTALTIME<<" s"<<endl;}
//***********************
#define rint register int
#define fo(a,b,c) for(rint a=b;a<=c;++a)
#define fr(a,b,c) for(rint a=b;a>=c;--a)
#define mem(a,b) memset(a,b,sizeof(a))
#define pr printf
#define sc scanf
#define ls rt<<1
#define rs rt<<1|1
typedef pair<int,int> PII;
typedef vector<int> VI;
typedef unsigned long long ull;
typedef long long ll;
typedef double db;
const double E=2.718281828;
const double PI=acos(-1.0);
const ll INF=(1LL<<);
const int inf=(<<);
const double ESP=1e-;
const int mod=(int)1e9+;
const int N=(int)1e6+; int mp[][];
unordered_map<ull,bool>mark;
struct node
{
ull id;
int step;
};
ull get()
{
ull now=,temp=;
int cnt=-;
for(int i=;i<=;++i)
{
for(int j=;j<=;++j)
{
++cnt;
if(mp[i][j])
now|=temp<<cnt;
}
}
return now;
}
bool ok(int x,int y)
{
return x>=&&x<=&&y>=&&y<=;
}
bool ans;
void bfs(ull start,bool f)
{
queue<node>q;
q.push({start,});
while(!q.empty())
{
node now=q.front();q.pop();
if(!f)
{
if(mark[now.id])continue;
mark[now.id]=;
}
else
{
if(mark[now.id])
{
ans=;
return;
}
}
if(now.step==)continue;
int cnt=-;
for(int i=;i<=;++i)
{
for(int j=;j<=;++j)
{
++cnt;
mp[i][j]=(int)(now.id>>cnt)&;
}
}
for(int i=;i<=;++i)
{
for(int j=;j<=;++j)
{
if(mp[i][j]&&ok(i-,j)&&mp[i-][j]==&&ok(i-,j)&&mp[i-][j]==)
{
mp[i-][j]=,mp[i][j]=;
q.push({get(),now.step+});
mp[i-][j]=,mp[i][j]=;
}
if(mp[i][j]&&ok(i+,j)&&mp[i+][j]==&&ok(i+,j)&&mp[i+][j]==)
{
mp[i+][j]=,mp[i][j]=;
q.push({get(),now.step+});
mp[i+][j]=,mp[i][j]=;
}
if(mp[i][j]&&ok(i,j-)&&mp[i][j-]==&&ok(i,j-)&&mp[i][j-]==)
{
mp[i][j-]=,mp[i][j]=;
q.push({get(),now.step+});
mp[i][j-]=,mp[i][j]=;
}
if(mp[i][j]&&ok(i,j+)&&mp[i][j+]==&&ok(i,j+)&&mp[i][j+]==)
{
mp[i][j+]=,mp[i][j]=;
q.push({get(),now.step+});
mp[i][j+]=,mp[i][j]=;
}
//--------------------------------------------------------------
if(mp[i][j]==&&ok(i-,j)&&mp[i-][j]==)
{
mp[i-][j]=,mp[i][j]=;
q.push({get(),now.step+});
mp[i-][j]=;mp[i][j]=;
}
if(mp[i][j]==&&ok(i+,j)&&mp[i+][j]==)
{
mp[i+][j]=,mp[i][j]=;
q.push({get(),now.step+});
mp[i+][j]=;mp[i][j]=;
}
if(mp[i][j]==&&ok(i,j-)&&mp[i][j-]==)
{
mp[i][j-]=,mp[i][j]=;
q.push({get(),now.step+});
mp[i][j-]=;mp[i][j]=;
}
if(mp[i][j]==&&ok(i,j+)&&mp[i][j+]==)
{
mp[i][j+]=,mp[i][j]=;
q.push({get(),now.step+});
mp[i][j+]=;mp[i][j]=;
}
}
}
}
} int main()
{
int x,y;
while(~sc("%d%d",&x,&y))
{
ans=;
mark.clear();
mem(mp,);
mp[x][y]=;
for(int i=;i<=;++i)
{
sc("%d%d",&x,&y);
mp[x][y]=;
}
bfs(get(),);
mem(mp,);
for(int i=;i<=;++i)
{
sc("%d%d",&x,&y);
mp[x][y]=;
}
bfs(get(),);
if(ans)
pr("YES\n");
else
pr("NO\n");
}
return ;
} /**************************************************************************************/
HDU1401(双向BFS)的更多相关文章
- POJ1915Knight Moves(单向BFS + 双向BFS)
题目链接 单向bfs就是水题 #include <iostream> #include <cstring> #include <cstdio> #include & ...
- HDU 3085 Nightmare II 双向bfs 难度:2
http://acm.hdu.edu.cn/showproblem.php?pid=3085 出的很好的双向bfs,卡时间,普通的bfs会超时 题意方面: 1. 可停留 2. ghost无视墙壁 3. ...
- POJ 3170 Knights of Ni (暴力,双向BFS)
题意:一个人要从2先走到4再走到3,计算最少路径. 析:其实这个题很水的,就是要注意,在没有到4之前是不能经过3的,一点要注意.其他的就比较简单了,就是一个双向BFS,先从2搜到4,再从3到搜到4, ...
- [转] 搜索之双向BFS
转自:http://www.cppblog.com/Yuan/archive/2011/02/23/140553.aspx 如果目标也已知的话,用双向BFS能很大程度上提高速度. 单向时,是 b^le ...
- 双向BFS
转自“Yuan” 如果目标也已知的话,用双向BFS能很大提高速度 单向时,是 b^len的扩展. 双向的话,2*b^(len/2) 快了很多,特别是分支因子b较大时 至于实现上,网上有些做法是用两个 ...
- HDU 3085 Nightmare Ⅱ (双向BFS)
Nightmare Ⅱ Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- HDU 3085 Nightmare Ⅱ 双向BFS
题意:很好理解,然后注意几点,男的可以一秒走三步,也就是三步以内的都可以,鬼可以穿墙,但是人不可以,鬼是一次走两步 分析:我刚开始男女,鬼BFS三遍,然后最后处理答案,严重超时,然后上网看题解,发现是 ...
- POJ 3126 Prime Path 解题报告(BFS & 双向BFS)
题目大意:给定一个4位素数,一个目标4位素数.每次变换一位,保证变换后依然是素数,求变换到目标素数的最小步数. 解题报告:直接用最短路. 枚举1000-10000所有素数,如果素数A交换一位可以得到素 ...
- Hdu1401-Solitaire(双向bfs)
Solitaire is a game played on a chessboard 8x8. The rows and columns of the chessboard are numbered ...
随机推荐
- 7.26T1四分图匹配
四分图匹配 题目描述 一天晚上,zzh 在做梦,忽然梦见了她. 见到她,zzh 也不去看她,只顾低头自语…… “噫,OI 这个东西,真是无奇不有.” “嘿,你又学了什么?” “嗯,学到了一种算法,”z ...
- ThreadGroupAPI
官方解释 public class ThreadGroup extends Object implements Thread.UncaughtExceptionHandler A thread gro ...
- Robot Framework(十八) 支持工具
5支持工具 5.1库文档工具(libdoc) libdoc是一种用于为HTML和XML格式的测试库和资源文件生成关键字文档的工具.前一种格式适用于人类,后者适用于RIDE和其他工具.Libdoc也没有 ...
- Jenkins系统初始化配置
1.点击系统管理-->全局安全配置 2.设置允许用户注册,点击保存 3.配置全局工具 4.配置maven文件路径,使用文件系统中的settings文件 5.配置jdk 6.配置maven 7.我 ...
- ailoop2里面的1个待考察的,在ailoop3里面的操作。(先使用海巨人,不使用英雄技能召唤图腾的问题)
承接上一篇博客HearthBuddy Ai 调试实战2 在使用海巨人的时候,少召唤了一个图腾(费用是对的) 研究ailoop2里面4个待考察的,在ailoop3里面的后续操作.ailoop3一共有36 ...
- 会声会影x7 每次安装均会提示:已安装这个产品的另一个版本
会声会影x7 每次安装均会提示:已安装这个产品的另一个版本 卸载C++2008 的库就行了 文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言.评论
- [Oracle] 简单建表语句
// 注意表名,字段名,索引名 尽量不要带引号 CREATE TABLE FIRSTTB ( "ID" NUMBER(8,0) not null primary key, & ...
- C之静态内存和动态内存
静态内存: * 自动申请,自动释放* 大小固定,内存空间连续* 从栈上分配的内存叫静态内存 动态内存: * 程序员自己申请 * new/malloc* 大小取决于虚拟内存的大小,内存空间不连续* ja ...
- C之函数返回一个以上的值
#include<stdio.h> #include<stdlib.h> //函数的返回值不能是数组 void add(int* a,int* b){ *a += 10; *b ...
- mongodb download
https://www.mongodb.org/dl/win32/x86_64-2008plus-ssl