hnu2021小学期程序设计 棋盘

题目

在这里插入图片描述

思路

思路我们还是分三步走 输入 中间处理 输出

(1) 如何输入

输入的话是一个整数以及一个与整数相关的棋盘,整数直接输入,棋盘的话用一个二维列表输入吧。由于每一行的整数之间没有分隔符,所以用join函数以及split函数将其处理成列表,用途是便于遍历。在此也声明一个字典,用于存放合理的棋盘的行数以及对应的个数。由于可能整个大棋盘是合理的所以还要加上键num,由于棋盘的棋子数一定大于0,故删去键为0的一项。

num=eval(input())
board=[]
dic=[]
for i in range(num):
	n=' '.join(input()).split()
	board.append(n)
	dic[i]=0
del dic[0]
dic[num]=0

(2)中间如何处理

我现在还没学算法(毕竟刚转专业过去),所以只会用暴力循环,当然这样也就导致我这个方法会让最后一个数据运行时间过长。
其实可以发现如果棋盘合理,那么它第一行第一列一定是1,因此我们可以由此来暴力遍历整个棋盘。
找到1以后,如何确定后面遍历棋盘的行数是一个问题。我的方法是用num-i以及num-j,找到它们的最小值即需要遍历棋盘的最大行数,这样会保证不会越出棋盘。
在这里插入图片描述

for i in range(num):
	for j in range(num):
		if board[i][j] == '1':
			line=min(num-i,num-j)
			count1=0#声明一个变量用于计算新棋盘中合理的数的个数
#找到最小值后再遍历
			for m in range(1,line+1):
				for u in range(m):
					for v in range(m):
						if (u+v)%2==0 and board[i+u][j+v]=='1':
#这是用来判断是否是正确的棋盘如果下标是2的倍数且在原棋盘中对应1即可
							count1+=1
						if (u+v)%2!=0 and board[i+u]j+v]=='0':
							count1+=1
			if count1==m**2:
				dic[m]+=1
#如果它是合理的 那么就将dic中对应的值加1
		else:
			break
#如果不满足开头是1就跳过这个循环继续下去

如何输出

现在我们的dic里面又1-num所有合理棋盘的个数,我们要输出最大的合理棋盘的行数k,但是其中会有一些比k大的数为0,可以将其去掉,再输出即可最大的键即可。

for i in range(1,num+1):
	if dic[i]==0:
		del dic[i]
print(max(dic.keys()),dic[max(dic.keys())])

完整代码

num=eval(input())
board,dic=[],{}
for i in range(num):
    n=' '.join(input()).split()
    board.append(n)
    dic[i]=0
dic[num]=0
del dic[0]
for i in range(num):
    for j in range(num):
        if board[i][j]=='1':
            line=min(num-i,num-j)            
            for m in range(1,line+1):
                count1=0
                for u in range(m): #新开一个棋盘 判断这个是否为正确的棋盘
                    for v in range(m):
                        if (u+v)%2==0 and board[i+u][j+v]=='1': #下标值和为偶数对应1
                            count1+=1
                        if (u+v)%2!=0 and board[i+u][j+v]=='0': #下标值和为奇数对应0
                            count1+=1
                if count1==m**2:
                    dic[m]+=1          
        else:
            continue
for i in range(1,num+1):
    if dic[i]==0:
        del dic[i]
print(max(dic.keys()),dic[max(dic.keys())])

可过OJ 最后一个运行时间过长

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一袍清酒付825

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

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

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

打赏作者

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

抵扣说明:

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

余额充值