poj 3126

来源:互联网 发布:淘宝市场行情教学视频 编辑:程序博客网 时间:2024/05/17 23:40

继续简单bfs

判断最小步骤把一个四位素数变成另外一个四位素数

#include <iostream>#include <sstream>#include <cstdio>#include <cstring>#include <cmath>#include <string>#include <vector>#include <set>#include <cctype>#include <algorithm>#include <cmath>#include <deque>#include <queue>#include <map>#include <queue>#include <list>#include <iomanip>using namespace std;                                               //////#define INF 0xffffff7#define maxn 200010#define max(a,b)(a>b?a:b)///bool flag[10000],flag1[10000];queue<int> q;int n, a, b, ans;void prime() /*把1000—9999的素数先一次性求出来,用flag1标记那个位置是否是素数*/{int i,j,k;for(i = 1001; i < 10000; i += 2){k = sqrt(i * 1.0);for(j = 2; j <= k; j++)if(i % j == 0) break;if(j >= k + 1)flag1[i] = 1;}}void bfs(){int tmp;int i, j;int hp = 0, tp = 1, lc = 1;while (!q.empty())q.pop();q.push(a);flag[a] = true;while (!q.empty()){tmp = q.front();q.pop();hp++;if (tmp == b)return;int change;//对千位进行数字变换for (i = 1; i <= 9; i++){change = tmp - tmp / 1000 * 1000;change += i * 1000;if (flag1[change] && !flag[change]){flag[change] = true;q.push(change);tp++;}}//对百位for (i = 0; i <= 9; i++){int temp;temp = tmp / 100 % 10;change = tmp - temp * 100;change += i * 100;if (flag1[change] && !flag[change]){flag[change] = true;q.push(change);tp++;}}//对十位for (i = 0; i <= 9; i++){int temp;temp = tmp / 10 % 10;change = tmp - temp * 10;change += i * 10;if (flag1[change] && !flag[change]){flag[change] = true;q.push(change);tp++;}}//对个位for (i = 0; i <= 9; i++){int temp;temp = tmp % 10;change = tmp - temp;change += i;if (flag1[change] && !flag[change]){flag[change] = true;q.push(change);tp++;}}if (hp == lc){ans++;lc = tp;}}}int main(){///int i, j;prime();cin >> n;while (n--){cin >> a >> b;memset(flag, false, sizeof(flag));ans = 0;bfs();cout << ans << endl;}///    return 0;}                                              


 

原创粉丝点击