双向BFS统计
Hdu1195
两个四位密码 问你最少多少步能到达
/*Huyyt*/
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int mod = 1e9 + ;
const int gakki = + + + + 1e9;
const int MAXN = 2e5 + , MAXM = 2e5 + ;
/*int to[MAXM << 1], nxt[MAXM << 1], Head[MAXN], ed = 1;
inline void addedge(int u, int v)
{
to[++ed] = v;
nxt[ed] = Head[u];
Head[u] = ed;
}*/
struct node
{
int now[];
int step;
} startpoint, endpoint, cnt, to;
void print(node x)
{
for (int i = ; i <= ; i++)
{
cout << x.now[i];
}
}
int finalans;
bool flag = false;
int vis[][][][];
char s[], e[];
queue<node> que[];
int stepsum[];
node get_change(node x, int aim)
{
node cur = x;
swap(cur.now[aim], cur.now[aim + ]);
return cur;
}
node get_next(node x, int aim, int y)
{
x.now[aim] += y;
if (x.now[aim] > )
{
x.now[aim] = ;
}
else if (x.now[aim] < )
{
x.now[aim] = ;
}
return x;
}
void get_vis(node x, int y)
{
vis[x.now[]][x.now[]][x.now[]][x.now[]] = y;
}
void check(node x, int y)
{
if (vis[x.now[]][x.now[]][x.now[]][x.now[]] == (y ^ ))
{
finalans = min(finalans, stepsum[] + stepsum[] + );
flag = true;
}
else if (vis[x.now[]][x.now[]][x.now[]][x.now[]] == -)
{
que[y].push(x);
get_vis(x, y);
}
}
void doit(int x)
{
while (que[x].front().step == stepsum[x] && que[x].size())
{
cnt = que[x].front();
que[x].pop();
for (int i = ; i <= ; i++)
{
if (i != )
{
to = get_change(cnt, i);
to.step = cnt.step + ;
check(to, x);
}
to = get_next(cnt, i, );
to.step = cnt.step + ;
//cout << x << " ", print(cnt), cout << " ", print(to), cout << endl;
check(to, x);
to = get_next(cnt, i, -);
to.step = cnt.step + ;
//cout << x << " ", print(cnt), cout << " ", print(to), cout << endl;
check(to, x);
}
}
stepsum[x]++;
}
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
flag = false;
scanf("%s", s + ), scanf("%s", e + );
stepsum[] = stepsum[] = ;
for (int i = ; i <= ; i++)
{
for (int j = ; j <= ; j++)
{
for (int k = ; k <= ; k++)
{
for (int w = ; w <= ; w++)
{
vis[i][j][k][w] = -;
}
}
}
}
finalans = INT_MAX;
for (int i = ; i <= ; i++)
{
while (que[i].size())
{
que[i].pop();
}
}
startpoint.step = , endpoint.step = ;
for (int i = ; i <= ; i++)
{
startpoint.now[i] = s[i] - '';
endpoint.now[i] = e[i] - '';
}
//print(startpoint), print(endpoint);
que[].push(startpoint), que[].push(endpoint);
get_vis(startpoint, ), get_vis(endpoint, );
while (!flag)
{
if (que[].size() > que[].size())
{
doit();
}
else
{
doit();
}
}
printf("%d\n", finalans);
}
return ;
}
//Hdu1195
Hdu1401
8X8的棋盘上有四个棋子 问你能不能在八步之内把一个状态转移到另一一个状态
双向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 ...
随机推荐
- React Native 安装
第一 :在天朝如果你可以违规上网的话便可以按 react native 中文网的文档进行安装与调试.地址为:https://reactnative.cn/docs/getting-started.ht ...
- 重学Python - Day 06 - python基础 -> linux命令行学习 -- 简单基础命令学习
学习资源 虚拟机工具:VMWare 12 linux :Ubuntu 14 或者CentOS 6 PS:ubuntu用远程连接工具的设置方法 step 1: 输入sudo apt-get instal ...
- staticmethod自己定制
class StaticMethod: def __init__(self,func): self.func=func def __get__(self, instance, owner): #类来调 ...
- ASP.NET Core EFCore 之DBFirst 自动创建实体类和数据库上下文
通过引用Nuget包添加实体类 运行 Install-Package Microsoft.EntityFrameworkCore.SqlServer 运行 Install-Package Micros ...
- mybatis批量更新update-设置多个字段值allowMultiQueries=true
mybatis由于简单易用性得到大家的认可和使用 但是在批量更新操作中,网上介绍的貌似不全,正好今天做个记录,大家一起进步 在实际项目开发过程中,常有这样的需求:根据ids更新表的某一个字段值,这时的 ...
- [转帖]Java 8新特性探究(九)跟OOM:Permgen说再见吧
Java 8新特性探究(九)跟OOM:Permgen说再见吧 https://my.oschina.net/benhaile/blog/214159 need study 很多开发者都在其系统中见过“ ...
- Junit+Mock单元测试
项目用的是maven,所需jar包在pom.xml文件里面配置,单元测试要用的jar具体如下: <dependency> <groupId>junit</groupId& ...
- Luogu P2569 [SCOI2010] 股票交易
此题链接到dp常见优化方法 开始的时候被纪念品误导,以为是多支股票,后来发现事情不妙: 这道题知道的是某一只股票的走势: \(Solution\): \(70pts\): 设\(f[i][j]\)表示 ...
- HDU2087 剪花布条(字符串...半暴力写的?
一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? Input输入中含有一些数据,分别是成对出现的花布条和小 ...
- 使用request+bs4爬取所有股票信息
爬取前戏 我们要知道利用selenium是非常无敌的,自我认为什么反爬不反爬都不在话下,但是今天我们为什么要用request+bs4爬取所有股票信息呢?因为他比较原始,因此今天的数据,爬取起来也是比较 ...