HNUCM-2023年春季学期《算法分析与设计》练习15

本文介绍了几个计算机科学中的算法问题,包括简单的递归求和、特定的文件存储处理、图的m着色问题的解决策略、素数环的构建以及经典的N皇后问题的回溯法解决方案。这些问题展示了在编程中如何运用递归和搜索策略来解决复杂问题。
摘要由CSDN通过智能技术生成

目录

简单递归求和

递归求和

文件存储

图的m着色问题

素数环

N皇后问题


简单递归求和

题省略!

import sys
sys.setrecursionlimit(100000)
def f(n:int):
    if n==1:
        return 1
    if n%2==0:
        return f(n-1)-2*n+1
    else:
        return f(n-1)+2*n-1
while True:
    n=int(input())
    print(f(n))

递归求和

题目描述

使用递归编写一个程序求如下表达式的计算结果:  (1<n<=20)
S(n) = 1*4 + 4*9 + 9*16 + 16*25 + ... + ((n-1)^2)*n^2
输入n,输出表达式S(n)的结果。

输入

单组输入,输入一个正整数n,1<n<=20。

输出

输出表达式S(n)的计算结果。

样例输入 Copy
3
样例输出 Copy
40
import sys
sys.setrecursionlimit(100000)
def s(n:int):
    if n==2:
        return 4
    return s(n-1)+((n-1)**2)*(n**2)
while True:
    n=int(input())
    print(s(n))

文件存储

题省略!

while True:
    m,n=map(int,input().split())
    a=list(map(int,input().split()))
    a.sort()
    ans=0
    for i in range(n):
        if a[i]<=m:
            ans+=1
            m-=a[i]
    print(ans)

图的m着色问题

题目描述

 给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的2个顶点着不同颜色,请输出着色方案。

输入

输入第一行包含n,m,k分别代表n个结点,m条边,k种颜色,接下来m行每行有2个数u,v表示u和v之间有一条无向边,可能出现自环边,所以请忽略自环边。

输出

输出所有不同的着色方案,且按照字典序从小到大输出方案。

样例输入 Copy
3 3 3
1 2
1 3
2 3
样例输出 Copy
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
def check(t,i):
    for j in range(1,t):
        if g[t][j]==1 and colors[j]==i:
            return 0
    return 1
def solve(t):
    if t>n:
        for i in range(1,n+1):
            print(colors[i],end=' ')
        print()
    else:
        for i in range(1,m+1):
            if check(t,i)==1:
                colors[t]=i
                solve(t+1)
while True:
    n,m,k=map(int,input().split())
    g=[[0 for j in range(n+1)] for i in range(n+1)]
    colors=[i for i in range(n+1)]
    for i in range(m):
        u,v=map(int,input().split())
        g[u][v]=1
        g[v][u]=1
    solve(1)

素数环

题目描述
现有1,2,3...,n,要求用这些数组成一个环,使得相邻的两个整数之和均为素数,要求你求出这些可能的环。
输入

输入正整数n。

输出
输出时从整数1开始逆时针输出,同一个环只输出一次,且满足条件的环应按照字典序从小到大输出。
注:每一个环都从1开始。
样例输入 Copy

6

样例输出 Copy
1 4 3 2 5 6
1 6 5 2 3 4
def solve(i,n,g,c):
    if i<n:
        for j in range(1,n+1):
            if c[j-1]==0:
                if i!=n-1:
                    check=0
                    for k in range(2,g[i-1]+j):
                        if (g[i-1]+j)%k==0:
                            check=1
                            break
                    if check==0:
                        g[i]=j
                        c[j-1]=1
                        solve(i+1,n,g,c)
                    g[i]=0
                    c[j-1]=0
                else:
                    check=0
                    for k in range(2,g[i-1]+j):
                        if (g[i-1]+j)%k==0:
                            check=1
                            break
                    for k in range(2,g[0]+j):
                        if (g[0]+j)%k==0:
                            check=1
                            break
                    if check==0:
                        g[i]=j
                        c[j-1]=1
                        solve(i+1,n,g,c)
                    g[i]=0
                    c[j-1]=0
    else:
        for j in range(n):
            print(g[j],end=" ")
        print()
while True:
    n=int(input())
    g=[0 for i in range(n)]
    c=[0 for j in range(n)]
    g[0]=1
    c[0]=1
    solve(1,n,g,c)

N皇后问题

题目描述

使用回溯法求解N后问题。

输入

皇后的个数。

输出

每一种方案及总方案数。

样例输入 Copy
4
样例输出 Copy
0 1 0 0
0 0 0 2
3 0 0 0
0 0 4 0
----------------
0 0 1 0
2 0 0 0
0 0 0 3
0 4 0 0
----------------
总方案数为:2

def solve(i):
    global n,count
    for j in range(n):
        if m[j]==0 and l[i+j]==0 and r[i-j+n]==0:
            a[i][j]=i+1
            m[j]=l[i+j]=r[i-j+n]=1
            if i==n-1:
                p(a)
                count+=1
            else:
                solve(i+1)
            a[i][j]=0
            m[j]=l[i+j]=r[i-j+n]=0
    return count
def p(a):
    for i in range(n):
        for j in range(n):
            print(a[i][j],end=' ')
        print()
    print("----------------")
n=int(input())
count=0
a=[[0]*n for _ in range(n)]
m=[0]*n
l=[0]*(2*n)
r=[0]*(2*n)
k=solve(0)
print("总方案数为:"+str(k))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值