作业比赛编号 : 1276 - 2022年春季学期《算法分析与设计》练习14

菱形图案

题目描述

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

输入

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

输出

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

样例输入 Copy

2
3
4

样例输出 Copy

  * 
 * * 
* * * 
 * * 
  * 

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

    * 
   * * 
  * * * 
 * * * * 
* * * * * 
 * * * * 
  * * * 
   * * 
    * 
#include
#include
using namespace std;
int main() {
    int n;
    while (cin >> n)
    {
        for (int i = n; i >= 0; --i) {
            for (int j = 1; j <= i; ++j)putchar(' ');
            for (int j = i; j <= n; ++j)printf("* ");
            putchar('\n');
        }
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= i; ++j)putchar(' ');
            for (int j = i; j <= n; ++j)printf("* ");
            putchar('\n');
        }
        putchar('\n');
    }
}

牛妹的蛋糕

题目描述

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

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

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

输入

输入n,0

输出

输出第一天蛋糕的数量。

样例输入 Copy

2
4

样例输出 Copy

3
10
#include
#include
using namespace std;
int fun(int n) {
    int sum = 1;
    for (int i = n - 1; i; i--)
    {
        sum = 3 * (sum + 1) / 2;
    }
    return sum;
}
int main() {
    int n;
    while (cin >> n)
    {
        cout << fun(n) << endl;
    }
}

尼科彻斯定理

题目描述

验证尼科彻斯定理,即:任何一个整数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
#include
#include
using namespace std;
 
int main() {
    int n;
 
    while (cin >> n)
    {   
        for (int i = 0; i

单源最短路径问题

题目描述

编程实现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
#include
#include
using namespace std;
#define Max 100000
int a[1005][1005];
int used[1005];
int dis[1005];
int main()
{
    int n, m;
    cin >> n >> m;
 
    for(int i=0;i> j >> k >> w;
        a[j][k] = w;
    }
    for (int i = 0; i < n; i++)
    {
        dis[i] = a[0][i];
    }
    for (int i = 0; i < n - 1; i++)
    {
        int min = Max;
        int j = 0;
        for (int k = 0; k < n; k++)
        {
            if (used[k] == 0 && dis[k] < min)
            {
                min = dis[k];
                j = k;
            }
        }
        used[j] = 1;
        for (int k = 0; k < n; k++)
        {
            if (used[k] == 0 && (dis[j] + a[j][k]) < dis[k])
            {
                dis[k] = dis[j] + a[j][k];
            }
        }
    }
    for (int i = 0; i < n; i++)
    {
        cout << dis[i] << " ";
    }
    cout << "\n";
}
 

ABC + DEF = GHI

题目描述

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

输入

输出

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

#include
#include
int a[9] = { 1,2,3,4,5,6,7,8,9 };
int num;
using namespace std;
typedef struct {
    int x, y, z;
}Node;
Node node[1005];
bool cmp(Node a, Node b) {
    if (a.x == b.x)
        return a.y < b.y;
    else
        return a.x < b.x;
}
int b[1005];
void fun(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]);
        fun(x + 1, y);
        swap(a[i], a[x]);
    }
 
}
int main()
{
    num = 0;
    fun(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

5 5
****@
*@@*@
*@**@
@@@*@
@@**@>

样例输出 Copy

2
#include 
#include 
using namespace std;
char a[200][200];
int d[200][200];
int flag = 0;
int n;
int m;
void solve(int r, int c, int id) {
    if (r < 0 || r >= m || c < 0 || c >= n) return;
    if (d[r][c] > 0 || a[r][c] != '@') return;
    d[r][c] = id;
    for (int i = -1; i <= 1; i++)
        for (int j = -1; j <= 1; j++)
            if (i != 0 || j != 0) solve(r + i, c + j, id);
}
int main() {
    while (~scanf("%d %d", &m, &n)) {
        for (int i = 0; i < m; i++)
            scanf("%s", a[i]);
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++)
            {
                if (d[i][j] == 0 && a[i][j] == '@') solve(i, j, ++flag);
            }
        printf("%d", flag);
        printf("\n");
        flag = 0;
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++)
                d[i][j] = 0;
    }
    return 0;
}
 

 

你可能感兴趣的:(OJ,大数据)