poj1326(bfs)
Posted Emilylice
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj1326(bfs)相关的知识,希望对你有一定的参考价值。
这个题意是计算出从输入的第一个数开始到第二个数结束之间的素数(每一个素数都只改变一个数字),每改变一次就花掉1pound,输出总共要花的pounds。使最少的步骤成为第二个数据。要解决的主要问题就在于怎样确定那个要改变的素数与上一个数只有一个数字不同。
#include <iostream>
#include <queue>
#include <cmath>
#include <cstring>
using namespace std;
int visited[10000];
queue <int> vi;
int q;
int step[10000];
bool isprim(int n)//判断是否素数;
{
for (int i = 2; i <= sqrt(n*1.0); ++i)
{
if (n % i == 0)
return false;
}
return true;
}
int main()
{
int t,m,n,first,next,temp;
cin>>t;
while(t--)
{
memset(visited,0,sizeof(visited));
memset(step,0,sizeof(step));
cin>>m>>n;
vi.push(m);
step[m]=0;
visited[m]=1;
while(!vi.empty())
{
first = vi.front();
vi.pop();
// if(first == n)break;(由于多了这一条,错了很久,头疼死了)
for(int i = 0; i <= 9; i ++)//对数据变动,由1到9循环;
{
for(int j = 1; j <=4; j ++)//个十百千位分别各自变动;
{
if(j == 1 && i!= 0)//千位不能为0
{
next = i*1000+(first -first/1000*1000);//这个式子我想不出来是怎么写出来的
if(isprim(next) && !visited[next])//判断千位变动是否为素数,是否出现过,如果是素数且未出现过,加入队列,标记;以下同这一样;
{
vi.push(next);
visited[next]=1;
step[next]=step[first]+1;
}
}
if(j == 2)
{
next = first/1000*1000+i*100+(first - first/100*100);
if(isprim(next) && !visited[next])
{
vi.push(next);
visited[next]=1;
step[next]=step[first]+1;
}
}
if(j ==3)
{
next = first/100*100+i*10+(first-first/10*10);
if(isprim(next) && !visited[next])
{
vi.push(next);
visited[next]=1;
step[next]=step[first]+1;
}
}
if(j == 4)
{
next = first/10*10+i;
if(isprim(next)&& !visited[next])
{
vi.push(next);
visited[next]=1;
step[next]=step[first]+1;
}
}
}
}
if(visited[n])//判断n出现时在第几步;即访问了的时候(visited[n]==1)
temp = step[n];
}
cout<<temp<<endl;
}
}
以上是关于poj1326(bfs)的主要内容,如果未能解决你的问题,请参考以下文章
POJ1475 Pushing Boxes(BFS套BFS)
POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路)