枚举算法 openjudge 百练 python

https://www.icourse163.org/learn/PKU-1001894005?tid=1450413466#/learn/content
程序设计与算法(二)算法基础

2810:完美立方

# 2810:完美立方
# http://bailian.openjudge.cn/practice/2810/
# b<=c<=d
inputNum = input()
# 2,...,int(inputNum)
for a in range(2, int(inputNum) + 1):
    for b in range(2, a):
        for c in range(b, a):
            for d in range(c, a):
                if a*a*a == b*b*b + c*c*c + d*d*d:
                    print("Cube = %d, Triple = (%d,%d,%d)" % (a, b, c, d))

4148:生理周期

# 4148:生理周期
# http://bailian.openjudge.cn/practice/4148

count = 1
while True:
    p, e, i, d = [int(s) for s in input().split()]
    if d == -1:
        break

    #第一次高峰出现的时间
    p = p % 23
    e = e % 28
    i = i % 33
    # print(p, e, i)
    
#     所求的时间<=21252
    for day in range(i, d + 21252 + 1, 33):  #在[i, d + 21252]区间内找最小的i + 33 *n
        if day % 23 == p and day % 28 == e:
            if day <= d:
                day += 21252  #题目要求在给定时间d之后的某一天
            print("Case %d: the next triple peak occurs in %d days." % (count, day - d))
#             从给定时间起,下一次三个高峰同一天的时间(距离给定时间的天数)。
            break

    count += 1

2692:假币问题

# 2692:假币问题
# http://bailian.openjudge.cn/practice/2692

def IsFake(cc,light,leftside,rightside,result):
    for ii in range(0, 3):
#         如果假设假币cc是轻的
        if light:
            sleft = leftside[ii]
            sright = rightside[ii]
#         如果假设假币cc是重的
        else:
            sleft = rightside[ii]
            sright = leftside[ii]
        if result[ii] == 'up': # 右端高
            if sright.find(cc) == -1: # 如果假设假币cc不在右边,那么假设假币cc不是轻的
                return False
        elif result[ii] == 'even': # 平衡
            if sright.find(cc)!=-1 or sleft.find(cc)!=-1:
                return False
        elif result[ii] == 'down': # 右端低
            if sleft.find(cc) == -1: # 如果假设假币cc不在左边,那么假设假币cc不是轻的
                return False
    return True


leftside = ['left', 'left', 'left']
rightside = ['righ', 'righ', 'righ']
result = ['resu', 'resu', 'resu']

# 第一行有一个数字n,表示有n组测试用例
num = int(input())
# print(num)
while num > 0:
    for ii in range(0, 3):
        leftside[ii], rightside[ii], result[ii] = [s for s in input().split()]
    for cc in [chr(i) for i in range(65,77)]:
        if IsFake(cc,True,leftside,rightside,result):
            print("%c is the counterfeit coin and it is light." % cc)
            break
        elif IsFake(cc,False,leftside,rightside,result):
            print("%c is the counterfeit coin and it is heavy." % cc)
            break
    
    num -= 1




2811:熄灯问题

# 2811:熄灯问题
# http://bailian.openjudge.cn/practice/2811/

def guess():
    #根据press的第一行和puzzle的第一行,确定press其他行的值
    for r in range(1, num_row):
        for c in range(1, num_col + 1):
            #             如果puzzle[r][c]原来就是1或者被它上左右的按钮按成了1,那么要求press[r + 1][c]=1
            press[r + 1][c] = (puzzle[r][c] + press[r][c] + press[r - 1][c] +
                               press[r][c - 1] + press[r][c + 1]) % 2

    for c in range(1, num_col + 1):
        #         如果最后一行的puzzle[num_row][c]上左右的按钮press未能将其熄灭,那么此次枚举失败
        if (press[num_row][c - 1] + press[num_row][c] + press[num_row][c + 1] +
                press[num_row - 1][c]) % 2 != puzzle[num_row][c]:
            return 0  # 失败
    return 1  # 成功


# 枚举第一行按下开关的所有可能性,有2^num_col个
# def enumeration():
#     while guess() == 0: # 如果枚举失败,那么继续枚举
#         press[1][1] += 1
#         col = 1
#         while (press[1][col] > 1):
#             press[1][col] = 0
# #             枚举下一列
#             col += 1
#             press[1][col] += 1
#         continue


# 枚举第一行按下开关的所有可能性,有2^num_col个
def enumeration():
    state = 0
    while guess() == 0:  # 如果枚举失败,那么继续枚举
        state_ = state
        for jj in range(1, num_col + 1):
            press[1][jj] = state_ % 2
            state_ = state_ // 2
        state += 1
        continue


num_row = 5
num_col = 6
line = [[0] * (num_col + 2)] * (num_row + 1)
line[0] = [0] * (num_col + 2)
for i in range(1, num_row + 1):
    # line[i]=input("请输入第"+str(i)+"行:").split(' ')
    inputline = input().split(' ')
    #将line中的元素转换为整型
    inputline = list(map(int, inputline))
    inputline.insert(0, 0)
    inputline.insert(num_col + 1, 0)
    line[i] = inputline
puzzle = line
press = [[0 for col in range(num_col + 2)]
         for row in range(num_row + 1)]  # (num_row+1)*(num_col+2)  不要写反

enumeration()
for ii in range(1, num_row + 1):
    for jj in range(1, num_col + 1):
        if jj == num_col:
            print("%d" % press[ii][jj])
        else:
            print("%d " % press[ii][jj], end="")
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zzz的学习笔记本

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值