PeterBishop

求大腿

3126素数之间的路径
#include <iostream>
#include <queue>
using namespace std;
#define MAXV 10000
bool prime[MAXV];

void init() //对素数打表,将素数的值设置为下标省去了查表
{	
	int i, j;
	for (i = 1000; i <= MAXV; i++) 
	{
		for (j = 2; j<i; j++)
			if (i%j == 0) 
			{
				prime[i] = false;
				break;
			}
		if (j == i) 
			prime[i] = true;
	}
}

int bfs(int first, int last) 
{
	bool dis[MAXV];
	queue <int>q;
	int v, i, j, temp, vtemp, count[MAXV], t[4];
	memset(dis, false, sizeof(dis));//两个数组其实也可以用结构体
	memset(count, 0, sizeof(count));

	q.push(first);
	dis[first] = true;//标记

	while (!q.empty()) 
	{
		v = q.front();
		q.pop();

		t[0] = v / 1000;
		t[1] = v % 1000 / 100;
		t[2] = v % 100 / 10;
		t[3] = v % 10;//位数

		for (j = 0; j<4; j++) //对四个位数一一尝试
		{
			temp = t[j];
			for (i = 0; i < 10; i++)//0-9一一尝试
			{
				if (i != temp)
				{
					t[j] = i;
					vtemp = t[0] * 1000 + t[1] * 100 + t[2] * 10 + t[3];
					if (!dis[vtemp] && prime[vtemp])
					{
						count[vtemp] = count[v] + 1;
						dis[vtemp] = true;
						q.push(vtemp);
					}
					if (vtemp == last) 
						return count[vtemp];
				}
			}
			t[j] = temp;//被修改后还原
		}
		if (v == last) 
			return count[v];
	}
	return -1;
}

int main() {
	int n, a, b, key;
	init();
	scanf("%d", &n);
	while (n--) 
	{
		scanf("%d%d", &a, &b);
		key = bfs(a, b);
		if (key != -1) 
			printf("%d\n", key);
		else 
			printf("Impossible\n");
	}
	return 0;
}

阅读更多
个人分类: POJ
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

3126素数之间的路径

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭