本题目要求读入1个十进制的数A,将A按位右移1位,输出移位后的数的二进制、八进制、十六进制表示结果
(如果A不是整数,需要对其取整后再移位)
输入格式:
输入十进制的数
输出格式:
输出的结果用“| * |”进行分隔
A=float(input())
a=int(A)>>1
print(f'{a:b}',f'{a:o}',f'{a:x}',sep='| * |')
前面的A* 算法调试有时会出现一点问题,因此重新使用了C++配合Python的方式,实现自动寻路的A*算法。
首先用DEV C++生成地图文本,语法基本同前面地图生成语句,只不过增加了循环写入到txt文本中。
for (int i=0;i<=m+1;i++) {
outfile<<" '";
for (int j=0;j<=n+1;j++) {
if(i == start.x && j == start.y) {
outfile<<"S";
}
else if(i== m&&j==n){
outfile<<"E";
}
else if(G[i][j] == NOTHING) {
outfile<<".";
}
else {
outfile<<"#";
}
}
outfile<<"',\n";
}
outfile.close();//关闭文件,保存文件。
随机生成的地图文本如下:
将生成的文本复制到python的tm数组中,作为地图基本参数。并对基本界面进行设计。
for i in range(self.width):
for j in range(self.height):
if test_map[j][i] == '#':
node = self.canvas.create_rectangle(i * 10 + 50 - self.__r,
j * 10 + 50 - self.__r, i * 10 + 50 + self.__r,
j * 10 + 50 + self.__r,
fill="#000000",
outline="#ffffff",
tags="node",
)
if test_map[j][i] == '*':
node = self.canvas.create_rectangle(i * 10 + 50 - self.__r,
j * 10 + 50 - self.__r, i * 10 + 50 + self.__r,
j * 10 + 50 + self.__r,
fill="#00ff00",
outline="#ffffff",
tags="node",
)
调试程序,界面如下图:
部分A* 寻路核心代码如下:
def find_path(self):
p = Node_Elem(None, self.s_x, self.s_y, 0.0)
while True:
self.extend_round(p)
if not self.open:
return
idx, p = self.get_best()
if self.is_target(p):
self.make_path(p)
return
self.close.append(p)
del self.open[idx]
def make_path(self, p):
while p:
self.path.append((p.x, p.y))
p = p.parent
def is_target(self, i):
return i.x == self.e_x and i.y == self.e_y
def get_best(self):
best = None
bv = 10000000 # MAX值
bi = -1
for idx, i in enumerate(self.open):
value = self.get_dist(i)
if value < bv:
best = i
bv = value
bi = idx
return bi, best
def get_dist(self, i):
# F = G + H
# G 为当前路径长度,H为估计长度
return i.dist + math.sqrt((self.e_x - i.x) * (self.e_x - i.x)) + math.sqrt((self.e_y - i.y) * (self.e_y - i.y))
可在DEV C++中运行DrawMaze程序生成新地图并用Pycharm进行A*寻路
首先需要将输入的十进制数转换为整数类型,可以使用int()函数进行转换。
然后使用位运算符>>进行按位右移,右移的位数需要根据题目要求确定。移位后需要将结果转换为二进制、八进制和十六进制表示。
具体步骤如下:
1.输入十进制数并转换为整数类型:
dec_num = int(input("请输入十进制数:"))
2.根据题目要求进行位移,例如右移3位:
shift_num = dec_num >> 3
3.将移位后的结果转换为二进制、八进制、十六进制表示,并用“| * |”进行分隔输出:
bin_num = bin(shift_num)
oct_num = oct(shift_num)
hex_num = hex(shift_num)
print(bin_num, oct_num, hex_num, sep="|*|")
注意:如果输入的不是整数,需要对其取整再进行移位。
完整代码如下:
dec_num = int(input("请输入十进制数:"))
if dec_num != int(dec_num):
print("输入的不是整数,已将其取整。")
dec_num = int(dec_num)
shift_num = dec_num >> 3
bin_num = bin(shift_num)
oct_num = oct(shift_num)
hex_num = hex(shift_num)
print(bin_num, oct_num, hex_num, sep="|*|")