백준(BOJ) 풀이

[백준 17836] 공주님을 구해라

오호라-노이혼 2019. 11. 10. 20:32

def maze(M,m,n,p,q):

    a=[]

    b=set()

    a.append([(p,q)])

    b.add((p,q))

    k=0

    if (1,1)==(p,q):

        return 0

    

    d=set()

    while (1,1)!=(m,n):

        d=set()

        for i in range(len(a[k])):

            if 0<a[k][i][0]-1<=m:

                if M[a[k][i][0]-2][a[k][i][1]-1]=='1' and ((a[k][i][0]-1,a[k][i][1]) in b)==False:

                    b.add((a[k][i][0]-1,a[k][i][1]))

                    d.add((a[k][i][0]-1,a[k][i][1]))

            if 0<a[k][i][1]-1<=n:

                if M[a[k][i][0]-1][a[k][i][1]-2]=='1' and ((a[k][i][0],a[k][i][1]-1) in b)==False:

                    b.add((a[k][i][0],a[k][i][1]-1))

                    d.add((a[k][i][0],a[k][i][1]-1))

            if 0<a[k][i][0]+1<=m:

                if M[a[k][i][0]][a[k][i][1]-1]=='1' and ((a[k][i][0]+1,a[k][i][1]) in b)==False:

                    b.add((a[k][i][0]+1,a[k][i][1]))

                    d.add((a[k][i][0]+1,a[k][i][1]))

            if 0<a[k][i][1]+1<=n:

                if M[a[k][i][0]-1][a[k][i][1]]=='1' and ((a[k][i][0],a[k][i][1]+1) in b)==False:

                    b.add((a[k][i][0],a[k][i][1]+1))

                    d.add((a[k][i][0],a[k][i][1]+1))

        a.append(list(d))

        k+=1

        if ((1,1) in d)==True:

            return k

        if k==n*m+1:

            return -1

m,n,t=map(int, input().split())

M=[input().replace(" ","") for _ in range(m)]

N=[]

 

for i in range(m):

    if M[i].find("2")!=-1:

        p=i+1

        q=M[i].find("2")+1

    temp=M[i].replace("0","2")

    temp=temp.replace("1","0")

    temp=temp.replace("2","1")

    N.append(temp)

 

alpha=maze(N,m,n,m,n)

beta=maze(N,m,n,p,q)

gamma=m+n-p-q

 

if alpha<0 and beta>=0:

    if beta+gamma<=t:

        print(beta+gamma)

    else:

        print("Fail")    

elif alpha<0 and beta<0:

    print("Fail")

elif alpha>=0 and beta<0:

    if alpha<=t:

        print(alpha)

    else:

        print("Fail")

else :

    if min(alpha,beta+gamma)<=t:

        print(min(alpha,beta+gamma))

    else:

        print("Fail")