python实现图的遍历(深搜/广搜)+筛选法求素数

 题目:

给定两个四位素数a  b,要求把a变换到b。变换的过程要保证:每次变换出来的数都是一个四位素数,而且当前这步的变换所得的素数与前一步得到的素数,只能有一个位置上的数字不同,而且每步得到的素数都不能重复。已知 a=1373, b=8017,编写程序,找出所需变换的次数。 

http://www.shiyanbar.com/ctf/practice

 筛选法求素数,建表,搜索。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def ForGragh(t,n):
	primes = [True] * (n+1)
	p = 2
	while p*p <= n:
		if primes[p]:
			for i in range(p*2,n+1,p):
				primes[i] = False
		p += 1
	primes = [x for x in range(t,n+1) if primes[x]]
	gra = [[0 for i in range(n+1)]for i in range(n+1)]
	for i in primes:
		gra[i] = []
		for j in primes:
			if check (i,j):
				gra[i].append(j)
	return gra

def check(a,b):
	t = 1000;
	s = 0;
	while t >= 1:
		x = int(a / t)
		y = int(b / t)
#		print (x,y)
#		print (a,b,t)
		if x == y:
			s += 1
		a = a - x * t
		b = b - y * t
		t = t / 10
	if s == 3:
		return True
	return False

def DFS(gra,start,end):
	path = [start]
	sou(gra,path,end)
	return path

def sou(gra,path,end):
	global F
	state = path[-1]
	if F:
		return
	if state == end:
		print(path) 
		F = True
		return
	else:
		for arc in gra[state]:
			if arc not in path:
				sou(gra,path+[arc],end)

def BFS(gra,start,end):
	q = [start]
	ever = [start]
	path = [0 for i in range(end+1)]
	t = 1
	while t>0:
		state = q.pop(0)
		t -= 1
		if state == end:
			printpath(state,path)
			break
		for arc in gra[state]:
			if arc not in ever:
				q += [arc]
				path[arc] = state
				ever += [arc]
				t += 1

def printpath(t,path):
	if path[t] == 0:
		print(t)
		return
	else:
		printpath(path[t],path)
	print(t)

start = 1373
end = 8017
global F
F = False
gra = ForGragh(start,end)
#print(gra)
#DFS(gra,start,end)
BFS(gra,start,end)

 

 

你可能感兴趣的:(python实现图的遍历(深搜/广搜)+筛选法求素数)