'''
https://wenku.baidu.com/view/2ba4571a598102d276a20029bd64783e09127dba.html?ind=2&fr=wenchuang&_wkts_=1716252992507&bdQuery=%E8%93%9D%E6%A1%A5%E6%9D%AF%E5%8E%86%E5%B9%B4%E7%9C%9F%E9%A2%98
'''
import copy
'''
小明先把硬币摆成了一个n行m列的矩阵。
随后,小明对每一个硬币分别进行一次Q操作。
对第x行第y列的硬币进行 Q 操作的定义:
将所有第i*x行,第j*y列的硬币进行翻
其中 1=< i <= n
1=< j <= m
其中i和j为任意使操作可行的正整数,行号和列号都是从1开始。
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
当小明对所有硬币都进行了一次Q操作后,他发现了一个奇迹 ———— 所有硬币均为正面朝上。
小明想知道最开始有多少枚硬币是反面朝上的。于是,他向他的好朋友小M 寻求帮助。
聪明的小M告诉小明,只需要对所有硬币再进行一次Q操作,
即可恢复到最开始的状态。然而小明很懒,不愿意照做。
于是小明希望你给出他更好的方法。帮他计算出答案。
样例输入 (2行3列)
2 3
样例输出
1
'''
#定义Q操作
def op_q(mat,x,y,n,m):
for i in range(n):
for j in range(m):
if( i*x < n and j*y < m ):
mat[i*x][j*y] = -1 * mat[i*x][j*y]
'''
遍历出所有的情况,那么第一格有2中情况,第二个有两种情况,所以复杂度是 2^(m+n)次方
问题:如何遍历出所有情况
递归的方法:
将二维数组拉成1维数组,然后遍历
*
0 1
0 1 0 1
0 1 0 1 0 1 0 1
二叉树
遍历叶子节点
'''
def find_all(list_, deep):
if (deep == 3):
print(list_)
return
list_[deep] = -1
find_all(list_,deep+1)
list_[deep] = 1
find_all(list_,deep+1)
find_all([0,0,0], 0)
'''
将1维数组转换为2维数组
[ 0 , 1 , 2 , 3, 4 , 5 , 6, 7, 8]
[0 , 1 , 2]
[3 , 4 , 5]
[6 , 7 , 8]
(0,0) -> 0
(0,1) -> 1
(0,2) -> 2
(1,0) -> 3 1*3 + 0 -> i*列数 + j -> i*m + j
(1,1) -> 4 1*3 + 1
(1,2) -> 5 1*3 + 2
'''
# 将一维数组转换为二维数组
def convert_1d_to_2d(list_,n,m):
mat = []
# 新建行
for i in range(n):
mat.append([])
# 新建列
for each in mat:
for j in range(m):
each.append(0)
for i in range( 0,n ):
for j in range(0 , m):
mat[i][j] = list_[ i*m + j ]
print(mat)
return mat
mat = convert_1d_to_2d([0,1,2,3,4,5,6,7,8],3,3)
'''
将所有情况全部遍历出来,然后转换为二维数组
'''
m = 2
n = 3
# 定义一个全局变量将其存储起来
# 深度为m*n
g_all_list = []
g_deep = m*n
def find_all_2(list_, deep):
if (deep == g_deep):
# 定义一个全局变量用于存储
# 这里要深度拷贝
g_all_list.append( copy.deepcopy(list_) )
print("**")
print(list_)
return
list_[deep] = -1
find_all_2(list_,deep+1)
list_[deep] = 1
find_all_2(list_,deep+1)
find_all_2([0]*(m*n), 0)
for each in g_all_list:
print(each)
'''
转换为二维数组
'''
m = 2
n = 3
# 定义一个全局变量将其存储起来
# 深度为m*n
g_all_list = []
g_deep = m*n
def find_all_2(list_, deep):
if (deep == g_deep):
# 定义一个全局变量用于存储
# 这里要深度拷贝
g_all_list.append( copy.deepcopy(list_) )
print("**")
print(list_)
return
list_[deep] = -1
find_all_2(list_,deep+1)
list_[deep] = 1
find_all_2(list_,deep+1)
find_all_2([0]*(m*n), 0)
for each in g_all_list:
temp_mat = convert_1d_to_2d(each,m,n)
print(temp_mat)
print(each)
print("*****")
'''
进行q变换
'''
m = 2
n = 3
# 定义一个全局变量将其存储起来
# 深度为m*n
g_all_list = []
g_deep = m*n
def find_all_2(list_, deep):
if (deep == g_deep):
# 定义一个全局变量用于存储
# 这里要深度拷贝
g_all_list.append( copy.deepcopy(list_) )
print("**")
print(list_)
return
list_[deep] = -1
find_all_2(list_,deep+1)
list_[deep] = 1
find_all_2(list_,deep+1)
find_all_2([0]*(m*n), 0)
for each in g_all_list:
print("start===")
temp_mat = convert_1d_to_2d(each,m,n)
print(temp_mat)
print(each)
for i in range(m):
for j in range(m):
op_q(temp_mat,i,j,m,n)
print("--q")
print(temp_mat)
print("*****")
'''
统计sum函数
'''
def sum_count(mat):
cnt_ = 0
for i in range(len(mat)):
for j in range(len(mat[0])):
if(mat[i][j] == 1):
cnt_ = cnt_ + 1
return cnt_
m = 2
n = 3
# 定义一个全局变量将其存储起来
# 深度为m*n
g_all_list = []
g_deep = m*n
def find_all_2(list_, deep):
if (deep == g_deep):
# 定义一个全局变量用于存储
# 这里要深度拷贝
g_all_list.append( copy.deepcopy(list_) )
print("**")
print(list_)
return
list_[deep] = -1
find_all_2(list_,deep+1)
list_[deep] = 1
find_all_2(list_,deep+1)
find_all_2([0]*(m*n), 0)
for each in g_all_list:
print("start===")
temp_mat = convert_1d_to_2d(each,m,n)
print(temp_mat)
print(each)
for i in range(m):
for j in range(m):
op_q(temp_mat,i,j,m,n)
print("--q")
print(temp_mat)
cnt_ = sum_count(temp_mat)
print("cnt",cnt_)
if( cnt_ == m*n):
print("终于找到你")
print("*****")
蓝桥杯-硬币翻转
最新推荐文章于 2024-05-31 18:06:37 发布