1. 程式人生 > >洛谷 八皇后問題的注意事項

洛谷 八皇后問題的注意事項

題目描述

檢查一個如下的6 x 6的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行、每列有且只有一個,每條對角線(包括兩條主對角線的所有平行線)上至多有一個棋子。

上面的佈局可以用序列2 4 6 1 3 5來描述,第i個數字表示在第i行的相應位置有一個棋子,如下:

行號 1 2 3 4 5 6

列號 2 4 6 1 3 5

這只是跳棋放置的一個解。請編一個程式找出所有跳棋放置的解。並把它們以上面的序列方法輸出。解按字典順序排列。請輸出前3個解。最後一行是解的總個數。

//以下的話來自usaco官方,不代表洛谷觀點

特別注意: 對於更大的N(棋盤大小N x N)你的程式應當改進得更有效。不要事先計算出所有解然後只輸出(或是找到一個關於它的公式),這是作弊。如果你堅持作弊,那麼你登陸USACO Training的帳號刪除並且不能參加USACO的任何競賽。我警告過你了!

輸入輸出格式

輸入格式:

 

一個數字N (6 <= N <= 13) 表示棋盤是N x N大小的。

 

輸出格式:

 

前三行為前三個解,每個解的兩個數字之間用一個空格隔開。第四行只有一個數字,表示解的總數。

 

輸入輸出樣例

輸入樣例#1: 複製

6

輸出樣例#1: 複製

2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4

說明

題目翻譯來自NOCOW。

USACO Training Section 1.5


def judge(a,right,left,i,j):
    a_=a[:i]
    right_=right[:i]
    left_=left[:i]
    aa=j not in a_
    rr=(i+j)  not in right_
    ll=(i-j) not in left_
    if( j  not in a[:i])and ((i+j)  not in right[:i]) and  ((i-j)  not in left[:i]):
        return True
    else:
        return False
def dfs(i,num,l,a,right,left):
    global count
    level=i
    global ans
    for k in range(1,l+1):
        if judge(a,right,left,i,k):
            a[i]=int(k)
            right[i]=int(i+k)
            left[i]=int(i-k)
            if i ==l:
                count+=1
                num+=1
                if count<4:
                    aa=a[1:]
                    print(' '.join(str(m) for m in aa))
                    print("num",num)

            else:
                level=i+1
                dfs(level,num,l,a,right,left)
        else:

            if k==l:
                return



if __name__=='__main__':
    count=0
    l=int(input())
    num=0
    ans=[]
    right = [100 for h in range(l+1)]
    left = [100 for h in range(l+1)]
    a = [100 for h in range(l+1)]
    dfs(1,num,l,a,right,left)
    print(count)

證明在回溯的過程中,無法將下層的更新值da會上一層,智慧使用global 進行。

在回溯呼叫自身後,需要將下一層的標記全部清除掉,具體如下:

# def dfs(i,l,a):
#     global count
#     global b,c,d
#     if i>l:
#             count += 1
#             if count < 4:
#                 aa = a[1:]
#                 print(' '.join(str(m) for m in aa))
#                 return
#     else:
#         for k in range(1,l+1):
#             judge=b[k] or c[i+k] or d[50+i-k]
#             if not judge :
#                 a[i]=int(k)
#                 b[k]=1
#                 c[i+k]=1
#                 d[50+i-k]=1
#                 dfs(i+1,l,a)
#                 a[i] = 100
#                 b[k] = 0
#                 c[i + k] = 0
#                 d[50 + i - k] = 0
#
#             elif judge and k == l:
#                 return
#
#
# if __name__=='__main__':
#     count=0
#     l=int(input())
#
#     a = [100 for h in range(l+1)]
#     b = [0 for m in range(100)]
#     c = [0 for m in range(100)]
#     d = [0 for m in range(100)]
#     dfs(1,l,a)
#     print(count)
#     print(res)