2023年秋季学期《算法分析与设计》练习14 OJ-1421 算法分析与设计练习14,使用python、C语言

菱形图案

题目描述

KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的菱形图案。

输入

多组输入,一个整数(2~20)。

输出

针对每行输入,输出用“*”组成的菱形,每个“*”后面有一个空格。每输出一个菱形的后面需要空一行。

样例输入 Copy
2
3
4
样例输出 Copy
  * 
 * * 
* * * 
 * * 
  * 

   * 
  * * 
 * * * 
* * * * 
 * * * 
  * * 
   * 

    * 
   * * 
  * * * 
 * * * * 
* * * * * 
 * * * * 
  * * * 
   * * 
    * 
while True:
    n = int(input())
    i = n
    while i >= 0:
        print(' ' * i, end='')
        print('* ' * (n + 1 - i), end='')
        print(' ' * (i - 1))
        i -= 1
    i = 1
    while i <= n:
        print(' ' * i, end='')
        print('* ' * (n + 1 - i), end='')
        print(' ' * (i - 1))
        i += 1
    print('')

牛妹的蛋糕

题目描述

众所周知,牛妹非常喜欢吃蛋糕。

第一天牛妹吃掉蛋糕总数三分之一多一个,第二天又将剩下的蛋糕吃掉三分之一多一个,以后每天吃掉前一天剩下的三分之一多一个,到第n天准备吃的时候只剩下一个蛋糕。

牛妹想知道第一天开始吃的时候蛋糕一共有多少呢?

输入

输入n,0<n< 30。

输出

输出第一天蛋糕的数量。

样例输入 Copy
2
4
样例输出 Copy
3
10
while(1):
    day = int(input())
    num = 1
    i = 1
    while i < day:
        num = 3 * (num + 1) // 2
        i = i + 1
    print(int(num))

尼科彻斯定理

题目描述

验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和。

例如:

1^3=1

2^3=3+5

3^3=7+9+11

4^3=13+15+17+19

输入

多组输入,输入一个整数。

输出

输出分解后的字符串。

样例输入 Copy
6
样例输出 Copy
31+33+35+37+39+41
while True:
    n = int(input())
    s = ''
    a = 0
    for i in range(1, n + 1):   # (1,n)
        t = n * (n - 1) + a + 1
        s = s + str(t) + '+'
        a = a + 2
    print(s[: -1])

单源最短路径问题

题目描述

编程实现Dijkstra算法,求一个有向加权图中,从源点出发到其他各个顶点的最短路径。

输入

第1行第1个值表示顶点个数,第2个值表示边个数;第2行开始为边(两个顶点,边的起点和终点)及权重。

输出

顶点0到每一个顶点的最短路径长度。

样例输入 Copy
5 7
0 1 10
0 3 30
0 4 100
1 2 50
2 4 10
3 2 20
3 4 60
样例输出 Copy
0 10 50 30 60
while True:
    n, m = map(int, input().split())
    k=[[float("inf") for i in range(n)] for j in range(n)]
    for i in range(m):
        a,b,c=map(int,input().split())
        k[a][b]=c
    d=[float("inf") for i in range(n)]
    d[0]=0
    t=0
    u=[0 for i in range(n)]
    for i in range(n):
        maxlen=float("inf")
        for j in range(n):
            if u[j]==0 and maxlen > d[j]:
                maxlen=d[j]
                t=j
        u[t]=1
        for i in range(n):
            if u[i]==0 and d[t]+k[t][i]<d[i]:
                d[i]=d[t]+k[t][i]
    for x in d:
        print(x,end=" ")
    print()

ABC + DEF = GHI

题目描述

用1, 2, 3...9 这九个数字组成一个数学公式,满足:ABC + DEF = GHI,每个数字只能出现一次,编写程序输出所有的组合。

输入

输出

输出所有的 ABC + DEF = GHI,
每行一条数据,格式为ABC+DEF=GHI
输出结果按照ABC升序排列,如果ABC相同,则按照DEF升序排列。

#include<bits/stdc++.h>
#define swap(x, y) {int temp=x;x=y;y=temp;}
using namespace std;
const int N=1005;

typedef struct{
int x,y,z;
}Node;
Node node[N];
int num;
int a[9]={1,2,3,4,5,6,7,8,9};

bool cmp(Node a,Node b){
    if(a.x!=b.x)
        return a.x<b.x;
    else
        return a.y<b.y;
}
int b[N];
void Find(int x,int y){
    if(x==y){
	    int x1=a[0]*100+a[1]*10+a[2];
	    int x2=a[3]*100+a[4]*10+a[5];
	    int x3=a[6]*100+a[7]*10+a[8];
	    if(x1+x2==x3){
	        node[num].x=x1;
	        node[num].y=x2;
	    	node[num].z=x3;
	        num++;
	    }
	    return;
    }
    for(int i=x; i<=y; i++){
       swap(a[i],a[x]);
       Find(x+1,y);
       swap(a[i],a[x]);
    }
}

int main(){
    num=0;
    Find(0,8);
    sort(node,node+num,cmp);
    for(int i=0;i<num;i++){
        printf("%d+%d=%d\n",node[i].x,node[i].y,node[i].z);   
    }
}

油田问题

题目描述

输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块。如果两个字符“@”所在的格子相邻(横、竖或者对角线方向),即属于同一个八连块。

输入
多组输入
输入行数m,以及列数n。
然后输入*和@
1<=n,m<=100
输出
联通块个数
样例输入 Copy
<span style="background-color:#ffffff"><span style="color:#333333"><span style="color:#333333"><span style="background-color:#f5f5f5">5 5
****@
*@@*@
*@**@
@@@*@
@@**@</span></span></span></span>
样例输出 Copy
<span style="background-color:#ffffff"><span style="color:#333333"><span style="color:#333333"><span style="background-color:#f5f5f5">2</span></span></span></span>
#include<stdio.h>
#include <stdlib.h>

int fx[8]={-1,0,1,1,1,0,-1,-1};
int fy[8]={1,1,1,0,-1,-1,-1,0};
char p[100][100];
int dx[100][100];
int count; 

void s(int i,int j,int m,int n,int count){
    if(i<0||i>=m||j<0||j>=n||dx[i][j]>0||p[i][j]=='*') return;
    dx[i][j]=count;
    for(int k=0;k<8;k++)
        s(i+fx[k],j+fy[k],m,n,count);
}
int main(){
    int m,n;
    while(~scanf("%d %d",&m,&n)){
        for(int i=0;i<m;i++){
            scanf("%s",p[i]);
        }
        memset(dx,0,sizeof(dx));
        count=0;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(dx[i][j]==0&&p[i][j]=='@')
                    s(i,j,m,n,++count);
            }
        }
        printf("%d\n",count);
    }
    return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值