测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A33781. 翻卡片

填空题 困难

题目描述

翻卡片

题目描述

小蓝在玩翻卡片游戏,每张卡片一面写着大写字母“A”,另一面写着大写字母“B”。首先将卡片排成一个N*N的矩阵。有的卡片是A面朝上,有的卡片是B面朝上。

现给定N的值,及N*N矩阵中每张卡片的状态,请你帮助小蓝挑选一张B面的卡,翻转成A面,使得翻转后的上、下、左、右四个方向相连的A面卡片最多,并将相连最多的卡片数量输出。

例如:N=3,3*3的矩阵中的卡片状态如下:

选择红框内那张B面卡片,翻转为A面,可以使翻转后四个方向相连的A面卡片最多,为5张。

输入描述

第一行输入一个正整数N(2≤N≤50),表示矩阵的行数和列数

第二行开始输入N行,每行输入N个字符(‘A’或者‘B’),表示矩阵中卡片状态,字符之间以一个空格隔开

输出描述

输出一个整数,表示翻转后矩阵中上、下、左、右四个方向相连的最多A面卡片张数

样例输入

3

A B B

A B A

B A B

样例输出

5

参考答案

#参考答案1 from copy import deepcopy N=int(input()) grid=[] for _ in range(N): grid.append(input().split(',')) def max_area(new_grid,r,c): if r<0 or r>=N or c<0 or c>=N: return 0 if new_grid[r][c]!='A': return 0 new_grid[r][c]='C' return 1 + \ max_area(new_grid,r-1,c)+\ max_area(new_grid,r+1,c)+\ max_area(new_grid,r,c-1)+\ max_area(new_grid,r,c+1) ans=0 for r in range(N): for c in range(N): if grid[r][c]=='B': new_grid=deepcopy(grid) new_grid[r][c]='A' temp=max_area(new_grid,r,c) ans=max(temp,ans) print(ans)

答案解析

参考答案2:

#参考答案2

def dfs(xx,yy):

    s=1

    fx=[[0,1],[0,-1],[1,0],[-1,0]]

    for iii in range(4):

        dx=xx+fx[iii][0]

        dy=yy+fx[iii][1]

        if(dx<0 or dx>=x or dy<0 or dy>=x):

            continue

        if(summ[dx][dy] or f[dx][dy]=='B'):

            continue

        summ[dx][dy]=1

        s+=dfs(dx,dy)

    #print(s,xx,yy)

    return s

x=int(input())

f=[0]*x

summ=[0]*x

mx=0

for i in range(x):

    f[i]=input().split(',')

    summ[i]=[0]*x

for i in range(x):

    for j in range(x):

        if(f[i][j]=='B'):

            #f[i][j]='A'

            for xxx in range(x):

                for yyy in range(x):

                    summ[xxx][yyy]=0

            mx=max(mx,dfs(i,j))

            #f[i][j]='B'

print(mx)

上一题 下一题