代码题记录之保护小鸡鸡【八皇后问题】

45 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第13天,点击查看活动详情

大家好 我是短袖撸码蒂尔尼。今天带来的是一道python的题目,来自之前我的一个朋友的课程作业,在他提交完作业之后,我搞到了原题,题目难度不大。但我好久没做过这种题目了,就在此为大家分享一下解答思路。

题目阐述

image.png

image.png

image.png

思路阐述

这个题目思路比较简单:

  • 创建chicken类,类包含小鸡的x y坐标值。
  • 创建函数chickencompare 判断在横向 纵向 和对角线上的小鸡位置是否冲突

chicken类如下:

class chicken :
    def __init__(self,x,y):
        self.x=x;
        self.y=y;
    # judge parallel, vertical or two diagonal directions
    def chickencompare(self,chicken):
        if(self.x==chicken.x or self.y==chicken.y):
            return 1
        elif(self.x*self.y*chicken.x*chicken.y!=0):
            return (int)((self.x/chicken.x)==(self.y/chicken.y))
        else:
            return 0

然后接下来的判断就很简单了:

chickenlist=[]
for i in range(n):
    arr2=input()
    [x,y]=(int(j) for j in arr2.split())
    chickenlist.append(chicken(x,y))

if(n<2):
    print('Safe')
else:
    isAttack=0
    for i in range(0,n-2):
        for j in range(i+1,n-1):
            if(chickenlist[i].chickencompare(chickenlist[j])==1):
                print('Attack')
                isAttack=1
                break
    if(isAttack==0):
        print('Safe')

这里唯一要注意的是n的越界问题,其他的就是简单的遍历,比较,毫无难度,看下一题。

第二题

image.png

思路阐述

这是一个很经典的八皇后题目

在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

思路基本上就是:

  • 创建一个judge函数 判断是否冲突
  • 然后用getAllchickenPlacments用来模拟路线:
    • 当judge返回true的时候 落子 下一步进行 getAllchickenPlacments(r+1, n)递归

代码如下: judge函数 在水平,垂直,对角线上判断小鸡的位置是否冲突

def judge(r, c):
    for a,b in zip(range(r-1, -1, -1), range(c-1, -1, -1)):
        if chicken[a][b] == 1:
            return False
    for a,b in zip(range(r-1, -1, -1), range(c+1, n)):
        if chicken[a][b] == 1:
            return False
    for k in range(n):
        if chicken[k][c] == 1:
            return False

    return True

getAllchickenPlacments函数如下:

def getAllchickenPlacments(r, n):
    if r > n-1:
        global count_placements
        count_placements += 1
        return
    for c in range(n):
        if judge(r, c):
            chicken[r][c] = 1
            getAllchickenPlacments(r+1, n)
            chicken[r][c] = 0

剩下就是主程序了:

if __name__ == '__main__':
    arr = input()
    n = int(arr)
    count_placements = 0
    chicken = [[0 for i in range(n)] for i in range(n)]
    getAllchickenPlacments(0, n)
    print(count_placements)

好了,这就是这道简单的保护小鸡鸡的解题思路。

我是短袖撸码蒂尔尼
一名热爱阿森纳的前端工程师
如果本文对您有帮助,可以给一个免费的赞吗?谢谢!

名片.jpg