POJ3126 Prime Path (bfs+素数判断)
一开始想通过终点值双向查找,从最高位开始依次递减或递增,每次找到最接近终点值的素数,后来发现这样找,即使找到,也可能不是最短路径,
而且代码实现起来特别麻烦,后来搜了一下解题报告,才发现是bfs().
想想也是,题目其实已经提示的很清楚了,求最短的路径,对于每一个数,每次可以把4位中的任意一位, 换成与该位不相同的0-9中的任意一位,对于迷宫类
bfs每次转移数为上下左右四个状态,而此题就相当于每次可以转移40个状态(其实最低位为偶数可以排除,不过题目数据量较小,就不剪枝了),每次转移的这40个状态,都可能得到最小路径,对于每次转移得到的素数,标记一下used,同时标记一下深度(即所走过的步数)root,从起点m出发,每次进行40个方向的状态转移,直至找到终点n或者队列取空返回无解(-1);
一开始把rep(j,0,10)写成了rep(j,0,9),wa了半天,这种小细节一定要注意.
/*
* Created: 2016年03月30日 08时06分49秒 星期三
* Author: Akrusher
*
*/
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <deque>
#include <list>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <numeric>
#include <iomanip>
#include <bitset>
#include <sstream>
#include <fstream>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define in(n) scanf("%d",&(n))
#define in2(x1,x2) scanf("%d%d",&(x1),&(x2))
#define inll(n) scanf("%I64d",&(n))
#define inll2(x1,x2) scanf("%I64d%I64d",&(x1),&(x2))
#define inlld(n) scanf("%lld",&(n))
#define inlld2(x1,x2) scanf("%lld%lld",&(x1),&(x2))
#define inf(n) scanf("%f",&(n))
#define inf2(x1,x2) scanf("%f%f",&(x1),&(x2))
#define inlf(n) scanf("%lf",&(n))
#define inlf2(x1,x2) scanf("%lf%lf",&(x1),&(x2))
#define inc(str) scanf("%c",&(str))
#define ins(str) scanf("%s",(str))
#define out(x) printf("%d\n",(x))
#define out2(x1,x2) printf("%d %d\n",(x1),(x2))
#define outf(x) printf("%f\n",(x))
#define outlf(x) printf("%lf\n",(x))
#define outlf2(x1,x2) printf("%lf %lf\n",(x1),(x2));
#define outll(x) printf("%I64d\n",(x))
#define outlld(x) printf("%lld\n",(x))
#define outc(str) printf("%c\n",(str))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
#define mem(X,Y) memset(X,Y,sizeof(X));
typedef vector<int> vec;
typedef long long ll;
typedef pair<int,int> P;
const int dx[]={,,-,},dy[]={,,,-};
const int INF=0x3f3f3f3f;
const ll mod=1e9+;
ll powmod(ll a,ll b) {ll res=;a%=mod;for(;b;b>>=){if(b&)res=res*a%mod;a=a*a%mod;}return res;}
const bool AC=true; bool used[];
int root[];
int s[];
bool prime(int n){ //素数测试
for(int i=;i*i<=n;i++){
if(n%i==) return false;
}
return n!=; //1是例外
}
int bfs(int m,int n){ //m相当于起点,n相当于终点,此题就转化为求每次可以走40个方向的迷宫问题的最短距离;
queue <int> que;
que.push(m);
int q,now;
while(!que.empty()){
q=que.front();
que.pop();
if(q==n) return root[q];
s[]=q/;s[]=(q/)%;
s[]=(q%)/;s[]=q%;
rep(i,,){ //每次改变4位数中的一位
rep(j,,){ //j>=0&&j<=9,此处不能写成rep(j,0,9);
if(j!=s[i]){
now=q-(s[i]-j)*pow(,i);
if((!used[now])&&(prime(now))&&(now>)){ //注意最高为不能是0
root[now]=root[q]+;//步数加1
used[now]=true; //标记该素数已被使用
que.push(now);
}
}
}
}
}
return -; //从起点m出发所有能够转移到的素数都已用完,没找到解,就返回-1
}
int main()
{
int t,a,b;
in(t);
while(t--){
in2(a,b);
fill(used,used+,false);
mem(root,);
int ans=bfs(a,b);
if(ans!=-) out(ans);
else printf("Impossible");
}
return ;
}
POJ3126 Prime Path (bfs+素数判断)的更多相关文章
- POJ3126 Prime Path —— BFS + 素数表
题目链接:http://poj.org/problem?id=3126 Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submi ...
- poj 3126 Prime Path( bfs + 素数)
题目:http://poj.org/problem?id=3126 题意:给定两个四位数,求从前一个数变到后一个数最少需要几步,改变的原则是每次只能改变某一位上的一个数,而且每次改变得到的必须是一个素 ...
- POJ3126 Prime Path(BFS)
题目链接. AC代码如下: #include <iostream> #include <cstdio> #include <cstring> #include &l ...
- POJ 3126 Prime Path (BFS + 素数筛)
链接 : Here! 思路 : 素数表 + BFS, 对于每个数字来说, 有四个替换位置, 每个替换位置有10种方案(对于最高位只有9种), 因此直接用 BFS 搜索目标状态即可. 搜索的空间也不大. ...
- POJ 3126 Prime Path(素数路径)
POJ 3126 Prime Path(素数路径) Time Limit: 1000MS Memory Limit: 65536K Description - 题目描述 The minister ...
- poj3126 Prime Path 广搜bfs
题目: The ministers of the cabinet were quite upset by the message from the Chief of Security stating ...
- POJ 3126:Prime Path(素数+BFS)
The ministers of the cabinet were quite upset by the message from the Chief of Security stating that ...
- CD0J/POJ 851/3126 方老师与素数/Prime Path BFS
Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9982 Accepted: 5724 Descri ...
- POJ2126——Prime Path(BFS)
Prime Path DescriptionThe ministers of the cabinet were quite upset by the message from the Chief of ...
随机推荐
- curl post传递json数据
有时想在命令行使用post http提交一个表单,比较常用的是POST模式和GET模式 GET模式什么option都不用,只需要把变量写在url里面就可以了 比如:curl http://www.wa ...
- 【HDOJ】4737 A Bit Fun
水题.不过题目很有趣儿. #include <cstdio> #define MAXN 100005 int a[MAXN]; int main() { int t, n, m; int ...
- centos qt5,PyQt5 installation
一.SIP http://www.riverbankcomputing.com/software/sip/download 二.Centos6.5 qt 安装 1,centos linux系统必须 ...
- stat~~~访问文件状态的利器
Name stat, fstat, lstat - get file status Synopsis #include <sys/types.h>#include <sys/stat ...
- 【模拟】Codeforces 699A Launch of Collider
题目链接: http://codeforces.com/problemset/problem/699/A 题目大意: 给N个点,向左或向右运动,速度均为1,问最早什么时候有两个点相撞.无解输出-1 题 ...
- Linux网络编程echo多线程服务器
echo_server服务器多线程版本 #include <unistd.h> #include <stdlib.h> #include <stdio.h> #in ...
- 小菜学习Lucene.Net(更新3.0.3版本使用)
花了两天的时间研究了下Lucene.Net 发现确实挺好玩.... 最新版本是3.0.3 (最后更新时间2012-10) 可惜3.0.3版本的Lucene.net无法和盘古分词 (最新版为2.3.1. ...
- Percona Live 2016 PPT整理-zhaiwx_yinfeng
https://yq.aliyun.com/articles/54454?spm=5176.100239.bloglist.32.CllwIr
- 使用ImageView
@property (strong, nonatomic) UIPopoverController *pop; //选取图片- (IBAction)selectImage:(UIButton *)se ...
- Java基础知识强化之IO流笔记21:FileInputStream读取数据
1. 字节输入流的操作步骤: (1)创建字节输入流的对象 (2)调用read()方法读取数据,并把数据显示到控制台 (3)关闭字节输入流的对象资源 2. FileInputStream构造: File ...