题目:
给定两个四位素数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)