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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
跟我学Java面向对象程序设计技术及应用——识别某个自然数是否为质数素数)的Java 程序实现示例 1 什么是质数素数) 1 什么是质数素数) 对于什么是质数(Prime Number),读者可以查询百科。在百科中的定义如下(如下示图显示具体的定义):质 数又称素数。一个大于1的自然数(读者注意是自然数,不是普通的数字),除了1和它 自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是 合数)。 2 质数素数)的主要特性 注意:质数素数)有无限个,例如2,3,5,7,11,13,17 …等都是质数素数);但0和1不是质数素数),1既不是质数也不是合数。因为它的 约数有且只有1这一个约数;2是唯一的偶数质数素数),因为所有其他的偶数都可以 除以2。 质数素数)在公钥加密算法(如RSA)中有重要的应用。 3 如何判断一个数是否为质数素数) 判断一个数是质数素数),还是合数,可以根据它的约数的个数来确定:只有两个 约数的数,是质数;有三个或三个以上的约数的数是合数;有且只有一个约数的数既不 是质数也不是合数(比如自然数"1"既不是质数也不是合数)。 2 编程识别某个自然数是否为质数素数)的Java程序实现示例 1 在MyEclipse开发工具中创建Java工程项目 1、启动MyEclipse开发工具,并选择Java Project工程项目 2、在工程项目创建的对话框中输入项目名称JavaDemo,并选择项目存放的目录路径 3、点击对话框中的完成(Finish)按钮,将创建出一个空的Java应用程序项目 2 在创建的Java应用程序项目中添加示例程序类 1、右击所创建的Java应用程序项目名称JavaDemo,在弹出的快捷菜单中选择New新建一 个Java程序类 2、在类创建的对话框中输入包名称为com.bluedream.demo,类名称为JavaPrimeNumber ,并选择需要在JavaPrimeNumber类中创建出main()方法 3、点击对话框中的完成(Finish)按钮,将创建出一个空的Java程序类,在该类中自动 地包含有main()方法 4、编程示例中的功能实现的程序代码 在该Java程序中,获得用户从键盘中输入的一个数字变量,然后判断所输入的这个数 字是否为素数,并打印出判断的结果。 (1)程序代码示例 package com.bluedream.demo; import java.util.Scanner; public class JavaPrimeNumber { public static void main(String[] args) { System.out.println("请输入一个整数 ,并按回车键结束输入:"); int someOneInteger = new Scanner(System.in).nextInt(); for(int loopCounterInt=2; loopCounterInt<someOneInteger; loopCounterInt++){ if(someOneInteger % loopCounterInt==0){ System.out.println("你输入的"+someOneInteger+"不是一个素数。"); break; } else { System.out.println("你输入的"+someOneInteger+"是个素数。"); break; } } } } 示例程序中的循环只需要从自然数2开始(for循环中的int loopCounterInt=2定义),一直循环到小于所识别的数字其自身就可以结束循环。因为 小于等于3的自然数只有2和3是质数。 (2)源程序截图 5、在MyEclipse开发工具中执行该示例程序 (1)启动"Run As"中的"Java Application"运行器以在Java虚拟机环境中执行示例 (2)在显示的控制台中输入数字13,将显示出判断的结果(程序判断正确) (3)再在显示的控制台中输入数字12,将显示出判断的结果(程序判断正确) 3 精益求精优化程序代码 1 优化程序代码示例以提高程序执行的效率 1、前面的程序示例的效率是最低的 前面的示例程序主要是根据质数的定义编程实现的我们只需要从2开始,一直到小于 其自身,依次判断能否被n整除即可,能够整除则不是质数,否则是质数。因此,前面的 示例程序之所以是说效率是最低的,因为循环次数是随着识别的数字增大而增加。当所 识别的数字很大时,循环的次数也将很大。 对于一个正整数n而言,它对(n/2, n)范围内的正整数是必然不能够整除的,因此,在判断n的时候,没有必要让它除以该范 围内的数。据此可以对前面的示例程序代码进

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值