poj 3126

基本上可以说是做的第一道bfs题,稍微有点感觉了

//============================================================================
// Name        : 3126.cpp
// Author      :
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;

int ans[10000];
queue <int> q;
bool visit[10000], prime[10000];
int N, a, b;


int bfs(int m, int n){
	while(!q.empty()) q.pop();
	memset(ans, 0, sizeof(ans));
	q.push(m);
	visit[m] = true;
	int p;
	if(visit[n]) return ans[n];
	while(!q.empty()){
		p = q.front();
		q.pop();
		for(int i = 0;i <= 9;i++){
			if(prime[p/10*10 + i]&&!visit[p/10*10 + i]){
				q.push(p/10*10 + i);
				ans[p/10*10 + i] = ans[p]+1;
				visit[p/10*10 + i] = true;
			}
			if(prime[p/100*100+p%10+i*10]&&!visit[p/100*100+p%10+i*10]){
				q.push(p/100*100+p%10+i*10);
				ans[p/100*100+p%10+i*10] = ans[p]+1;
				visit[p/100*100+p%10+i*10] = true;
			}
			if(prime[p/1000*1000+p%100+i*100]&&!visit[p/1000*1000+p%100+i*100]){
				q.push(p/1000*1000+p%100+i*100);
				ans[p/1000*1000+p%100+i*100] = ans[p]+1;;
				visit[p/1000*1000+p%100+i*100] = true;
			}
			if(i!=0&&prime[p%1000+i*1000]&&!visit[p%1000+i*1000]){
				q.push(p%1000+i*1000);
				ans[p%1000+i*1000] = ans[p]+1;
				visit[p%1000+i*1000] = true;
			}
		}
		if(visit[n]){
			return ans[n];
		}
	}
}

int main() {
	freopen("a.txt", "r", stdin);
	memset(prime, true, sizeof(prime));
	prime[1] = false;
	for(int i = 2;i <= 9999/2;i++){
		if(prime[i]){
			for(int j = i<<1;j <= 9999;j+=i){
				prime[j] = false;
			}
		}
	}
	scanf("%d", &N);
	while(N--){
		scanf("%d%d",&a, &b);
		memset(visit, false, sizeof(visit));
		printf("%d\n", bfs(a, b));
	}
	return 0;
}

posted @ 2011-06-11 17:48  KOKO's  阅读(272)  评论(0编辑  收藏  举报