uva10067 Playing with Wheels 【建图+最短路】
题目: option=com_onlinejudge&Itemid=8&page=show_problem&problem=1008">uva10067 Playing with Wheels
题意:给出一个机器,有四个循环的轮子。见图,然后给出一个初始数和目标数,然后期间不能出现的数字,每一分钟能够拨动一个数。问你最短须要的时间。

分析:这个题目能够转化为求图的最短路。
由于有对于一个当前状态。有8种能够转化为的状态,那么我们能够把每一种状态转化为一个点,然后状态之间连长度 1 的边,然后求一次初始状态到目标状态的最短路。
開始的时候我们每一组数据建图一次,下来0.9s。然后优化了一下,就是在每次建图不能到达的边删除之后求完之后恢复过来,这样不用每次建图。下来0.19s,时间相当快了。就仅仅是一个spfa的时间复杂度O(m)、
AC代码:
#include <cstdio>
#include <iostream>
#include <queue>
#include <cstring>
#include <algorithm>
#include <stack>
#include <vector>
#include <utility>
#include <cmath>
using namespace std;
const int N = 10005;
const int M = 10000;
const int inf = 0x3f3f3f3f;
struct Node
{
int x,len;
};
vector<Node> v[N];
void add_Node(int x,int y,int len)
{
v[x].push_back((Node){y,len});
v[y].push_back((Node){x,len});
}
int count(int i,int j,int k,int f)
{
return ((i+10)%10)*1000+((j+10)%10)*100+((k+10)%10)*10+(f+10)%10;
}
int dir[10][5]=
{
{0,0,0,1},{0,0,0,-1},
{0,0,1,0},{0,0,-1,0},
{0,1,0,0},{0,-1,0,0},
{1,0,0,0},{-1,0,0,0}
};
void build(int i,int j,int k,int f)
{
int tmp=count(i,j,k,f);
for(int p=0; p<8; p++)
{
int tmp1=count(i+dir[p][0],j+dir[p][1],k+dir[p][2],f+dir[p][3]);
add_Node(tmp,tmp1,1);
}
}
void isit()
{
for(int i=0; i<10; i++)
for(int j=0; j<10; j++)
for(int k=0; k<10; k++)
for(int f=0; f<10; f++)
build(i,j,k,f);
}
int dis[N];
void spfa(int s)
{
int i;
queue<int> q;
for(i=0; i<N; i++)
dis[i]=inf;
dis[s]=0;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
for(i=0; i<v[u].size(); i++)
{
Node p=v[u][i];
if(dis[p.x]>dis[u]+p.len)
{
dis[p.x]=dis[u]+p.len;
q.push(p.x);
}
}
}
}
int dx[N],dy[N],dz[N],dk[N];
int main()
{
int T;
isit();
scanf("%d",&T);
while(T--)
{
int x,y,z,k;
scanf("%d%d%d%d",&x,&y,&z,&k);
int st=x*1000+y*100+z*10+k;
scanf("%d%d%d%d",&x,&y,&z,&k);
int en=x*1000+y*100+z*10+k;
int cc;
scanf("%d",&cc);
for(int i=0;i<cc;i++)
{
scanf("%d%d%d%d",&dx[i],&dy[i],&dz[i],&dk[i]);
int tmp=count(dx[i],dy[i],dz[i],dk[i]);
v[tmp].clear();
}
spfa(st);
if(dis[en]>=inf)
puts("-1");
else
printf("%d\n",dis[en]);
for(int i=0;i<cc;i++)
{
build(dx[i],dy[i],dz[i],dk[i]);
}
}
}
uva10067 Playing with Wheels 【建图+最短路】的更多相关文章
- 【建图+最短路】Bzoj1001 狼抓兔子
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个 ...
- CodeForces 786B Legacy(线段树优化建图+最短路)
[题目链接] http://codeforces.com/problemset/problem/786/B [题目大意] 给出一些星球,现在有一些传送枪,可以从一个星球到另一个星球, 从一个星球到另一 ...
- 【转】Codeforces Round #406 (Div. 1) B. Legacy 线段树建图&&最短路
B. Legacy 题目连接: http://codeforces.com/contest/786/problem/B Description Rick and his co-workers have ...
- G. 神圣的 F2 连接着我们 线段树优化建图+最短路
这个题目和之前写的一个线段树优化建图是一样的. B - Legacy CodeForces - 787D 线段树优化建图+dij最短路 基本套路 之前这个题目可以相当于一个模板,直接套用就可以了. 不 ...
- 【SDOI2017】天才黑客(前后缀优化建图 & 最短路)
Description 给定一张有向图,\(n\) 个点,\(m\) 条边.第 \(i\) 条边上有一个边权 \(c_i\),以及一个字符串 \(s_i\). 其中字符串 \(s_1, s_2, \c ...
- BZOJ 4289: PA2012 Tax 差分建图 最短路
https://www.lydsy.com/JudgeOnline/problem.php?id=4289 https://www.cnblogs.com/clrs97/p/5046933.html ...
- HDU 4725 The Shortest Path in Nya Graph( 建图 + 最短路 )
主要是建图,建好图之后跑一边dijkstra即可. 一共3N个点,1~N是原图中的点1~N,然后把每层x拆成两个点(N+x)[用于连指向x层的边]和(N+N+x)[用于连从x层指出的边]. 相邻层节点 ...
- CF-787D-线段树建图+最短路
http://codeforces.com/problemset/problem/787/D 题目大意是给出一个有向图,有N个节点,初始节点在S,询问S到所有点最短路.边的读入方式有三种, 1 u v ...
- FJNU 1196 汪老司机(DP or 建图+最短路)
1196: 汪老司机 Time Limit: 1000 MS Memory Limit: 257792 KB 64-bit interger IO format: %lld ...
随机推荐
- 【Cocos2d-x 粒子系统】火球用手指飞起来
程序: 创建球 sp1 = CCSprite::create("ball.png"); sp1->setPosition(ccp(10, visibleSize.height ...
- C++经典面试题(二)
近期看一些面试题,认为假设自己被问到了,并不能非常利落的回答出来. 一是从来没有这个意识,二是没有认真的梳理下. 以下对这些题做出分析,哈!个人能力有限,当中难免有疏漏,欢迎大家补充咯. 11.引用与 ...
- CentOS6.5解压缩文件.tar.gz .war .zip
拉开拉链.tar.gz文件: tar -zxvf web.tar.gz tar将文件解压缩到一个指定的文件夹. 拉开拉链.war .zip文件到指定的文件夹: unzip web.war -d web ...
- 【数据结构&&等差数列】KMP简介和算法的实现(c++ && java)
KMP算法假定了解案件的原则,其实很easy. KMP算法简述 关于根据自己的理解在这里. KMP该算法由三个发明人的名称(Knuth.Morris.Pratt)的首字母组成,又称字符串查找算法. 个 ...
- 基于 Android 的 3D 视频示例代码
笔者:Mark Liu 下载样本代码 简单介绍 在Android 中,创建一个可以播放视频剪辑的应用很easy:创建一个採用 3D 图形平面的游戏应用也很easy.可是,创建一个可以在 3D 图形对象 ...
- iOS 删除黑色边框线导航栏&删除搜索框的阴影边界线和中黑色文本输入框 - 解
删除黑色边框线导航栏 in viewDidload: [self.navigationController.navigationBar setBackgroundImage:[[UIImage all ...
- Android 混淆proguard的实现(图文)
1. 在Eclipse中的project编译执行后,在文件夹bin以下有生成一些文件,当中classes.dex是未经过混淆生成的.而我们要混淆的话,就要又一次生成一个混淆过的classes.dex ...
- C# 6.0 (C# vNext) 的新功能:Exception-Handling Improvements
于 C# 6.0 包裹在异常处理的新功能,有两个方面的改进: 异步处理(async and await)能力 catch block 总结使用.于 C# 5.0 释放 async and await, ...
- addChildViewController transitionFromViewController nib storyboard
本文记录addChildViewController由transitionFromViewController方法nib,storyboard的不同的效果. 在进行切换效果时,注意属于同一个story ...
- 【Linux探索之旅】第一部分第六课:Linux如何安装在虚拟机中
内容简介 1.第一部分第六课:Linux如何安装在虚拟机中 2.第二部分第一课预告:终端Terminal,好戏上场 Linux如何安装在虚拟机中 虽然我们带大家一起在电脑的硬盘上安装了Ubuntu这个 ...