蓝桥杯-硬币翻转


'''
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("*****")

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值