题目
思路
思路我们还是分三步走 输入 中间处理 输出
(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 最后一个运行时间过长