poj 3126 prim path bfs

   去年选拔省赛时候的题目,给了两个素数,问每次修改一位上的数字,修改几次能达到目标数字。最近老是没有

刷题的欲望。浑浑噩噩,这道简单的题目差点就放弃了,确实是搜索中比较简单的题目。每次只改变其中的一位,队

列维护,记录一下距离就可以了。。。下午还有比赛,尽量做吧,无所谓啦。

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<vector>
#include<set>
#include<string>
#include<algorithm>
#include<queue>
#define MAX 0x7fffffff

using namespace std;
int primer[10005];
int t[5];
int bfs(int n,int m)
{
	int vis[10000];
	int dis[10000];
	memset(dis,0,sizeof(dis));
	memset(vis,0,sizeof(vis));
	queue<int>que;
	que.push(n);
	int temp,tmp,i,j;
	dis[n] = 0;
	vis[n] = 1;
	while(!que.empty())
	{
		int y = que.front();
		que.pop();
		if(y == m)
			return dis[y];
		t[1] = y/1000%10;
		t[2] = y/100%10;
		t[3] = y/10%10;
		t[4] = y%10;
		//cout << t[1] << t[2] << t[3] << t[4] << endl;
		//cout << dis[y] << endl;
		//system("pause");
		for(i=1; i<=4; i++)
		{
			temp = t[i];
			for(j=0; j<10; j++)
			{
				if(j != t[i])
				{
					t[i] = j;
					tmp = t[1]*1000 + t[2]*100 + t[3]*10 + t[4];
					if(tmp >= 1000 && !vis[tmp] && !primer[tmp])
					{
						dis[tmp] = dis[y] + 1;
						vis[tmp] = 1;
						que.push(tmp);
					}
				}
			}
			t[i] = temp;
		}
	}
	return -1;
}
int main()
{
	int T,i,j,n,m;
	cin >>T;
	int en = sqrt(10000);
	memset(primer,0,sizeof(primer));
	for(i=2; i<=en; i++)
	{
		if(!primer[i])
			for(j=i+i; j<=10000; j+=i)
				primer[j] = 1;
	}
	while(T --)
	{
		cin >> n >> m;
		int ans = bfs(n,m);
		if(ans == -1)
			cout << "Impossible" << endl;
		else
			cout << ans << endl;
		
	} 
	return 0;
}


你可能感兴趣的:(poj 3126 prim path bfs)