POJ 3126 *** Prime Path
2015-12-09 08:51
239 查看
题意:给两个1000-9999内的素数A,B,每次改变A的一个位上的数字,得到后的数字必须为素数。问最少需要多少步才能得到B。
想法:对于A而言每次改变一个数字,那么用bfs遍历对A而言所有可能的状态同时判断是否为素数就可以了。
代码如下:
想法:对于A而言每次改变一个数字,那么用bfs遍历对A而言所有可能的状态同时判断是否为素数就可以了。
代码如下:
#pragma warning(disable:4996) #include<iostream> #include<cstdio> #include<cmath> #include<stack> #include<queue> #include<cstring> #include<sstream> #include<set> #include<string> #include<iterator> #include<vector> #include<map> #include<algorithm> using namespace std; typedef long long ll; int prime[10000]; int flag[10000]; int base[4] = { 1,10,100,1000 }; int main(void) { //获得素数 memset(prime, 1, sizeof(prime)); for (int i = 2; i < 10000; ++i) { if (prime[i]) for (int k = 2; k < 10010 / i; ++k) prime[i * k] = 0; } int n, ori, tar; cin >> n; while (n--) { cin >> ori >> tar; //如果ori==tar,直接输出结果 if (ori == tar) { cout << 0 << endl; continue; } //如果ori!=tar,按以下方式处理 memset(flag, 0, sizeof(flag)); flag[ori] = 1; queue<int> path; path.push(ori); int now, temp, sign = 1; while (!path.empty()&&sign) { now = path.front(); path.pop(); int o[4]; o[0] = now % 10, o[1] = now % 100 / 10; o[2] = now % 1000 / 100, o[3] = now / 1000; for (int i = 0; i < 4&&sign; ++i) for (int j = 0; j < 10&&sign; ++j) { temp = now - o[i] * base[i] + j*base[i]; if (temp == tar) { flag[tar] = flag[now]; sign = 0; break; } if (!flag[temp] && prime[temp] && temp>1000) { flag[temp] = flag[now] + 1; path.push(temp); } } } if (flag[tar])cout << flag[tar] << endl; else cout << "Impossible" << endl; } return 0; }
相关文章推荐
- 类目, 延展, 协议
- 防止用户直接访问url的权限控制
- session共享
- POJ 3087 *** Shuffle'm Up
- android学习一些帖子
- CSS3浏览器内核以及私有前缀
- 游戏公会竟然缔造了第一代自媒体,想不到吧
- C#中 virtual 和 abstract 的区别
- Android的EditText属性
- 杨辉三角
- android textview可以设置文字颜色 部分文字点击事件处理
- asmdisk opened & asmdisk cached
- Android实现九宫格解锁的方法
- vmware安装无法打开内核设备 \\.\Global\vmx86: 系统找不到指定的文件
- PE总结6---PE文件结构NT头之扩展头--IMAGE_OPTIONAL_HEADER
- top 详解
- SAP 物料移动类型查询表
- git使用(一)
- LocalDB 惹得祸
- Scala PartialFunction 与 括号