python语言做2016年蓝桥杯c语言A组的题------方格填数

方格填数

这个题在上一篇文章中用的暴力枚举把题做出来的,但并不是最好的解决方法,所以这次我们用深度优先搜索算法来解决。

深度优先搜索

深度优先搜索属于图算法的一种,是一个针对图和树的遍历算法,英文缩写为DFS即Depth First Search。深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图论问题,如最大路径问题等等。一般用堆数据结构来辅助实现DFS算法。其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。

举例:
深度优先搜索,是先看1,然后1可以到2,然后直接看2,2可以到3,5随便选一个都可以,我们到3好了,然后看3的那行可以到1,2,4,5,6随便选一个都可以,不过要去掉重复的,以此类推。可以排出很多种的。
在这里插入图片描述

如下的10个格子
±-±-±-+
| | | |
±-±-±-±-+
| | | | |
±-±-±-±-+
| | | |
±-±-±-+

(如果显示有问题,也可以参看【图1.jpg】)
图1
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)

一共有多少种可能的填数方案?

请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

import numpy as np
import math

def permutation(lst):
    if len(lst)==0 or len(lst)==1:
        return [lst]
    result=[]
    for i in lst:
        temp_list=lst[:]     #表示从头到尾输出,实际上复制出了一个新的list
        temp_list.remove(i)       #删除第一个出现的指定数据
        temp=permutation(temp_list)
        for j in temp:
            j.insert(0,i)     #在指定的位置插入数据
            result.append(j)
    return result

if __name__=="__main__":
    lst=[0,1,2,3,4,5,6,7,8,9]
    sum = 0
    temp_result=permutation(lst)  #统计所有全排列
    map = np.zeros((4,5))
    for i in range(4):
        map[i][4]=1000
    for i in range(5):
        map[3][i]=1000
    map[0][0]=1000
    map[2][3]=1000

    for lis in temp_result:
        k = 0
        for t in range(1,11):       #填数字
            map[t//4][t%4]=lis[t-1]

        for i in range(3):          #判断是否符合要求
            for j in range(4):
                if(math.fabs(map[i][j]-map[i][j+1]) ==1 or
                   math.fabs(map[i][j]-map[i+1][j]) ==1 or
                   math.fabs(map[i][j]-map[i+1][j-1]) ==1 or
                   math.fabs(map[i][j]-map[i+1][j+1]) ==1):
                     k=1;
                     break
        if k != 1:
            sum=sum + 1    #统计符合要求的排列
    print('sum=',sum)

运行结果截图:
运行结果

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值