2022年春季学期《算法分析与设计》练习14

问题 A: 菱形图案

题目描述

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

输入

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

输出

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

样例输入 Copy

2
3
4

样例输出 Copy

  * 
 * * 
* * * 
 * * 
  * 

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

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

import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        int n;
        Scanner scan=new Scanner(System.in);
        while(scan.hasNext()){
            n=scan.nextInt();
            for(int i=n;i>=0;--i){
                for(int j=1;j<=i;++j) System.out.printf(" ");
                for(int j=i;j<=n;++j) System.out.printf("* ");
                System.out.println();
            }
            for(int i=1;i<=n;++i){
                for(int j=1;j<=i;++j) System.out.printf(" ");
                for(int j=i;j<=n;++j) System.out.printf("* ");
                System.out.println();
            }
            System.out.println();
        }

    }
}

问题 B: 牛妹的蛋糕

题目描述

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

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

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

输入

输入n,0<n< 30。

输出

输出第一天蛋糕的数量。

样例输入 Copy

2
4

样例输出 Copy

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

问题 C: 尼科彻斯定理

题目描述

验证尼科彻斯定理,即:任何一个整数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 <iostream>  
using namespace std;
int main(){
    int n;
while(cin>>n){
   int m;
   m=n*(n-1)+1;
   for(int i=1;i<=n;i++){
       if(i<n){
       cout<<m<<"+";
       }
        
       if(i==n){
           cout<<m;
       }
       m=m+2;
   }
 
   cout<<endl;
     
 }
 
}

问题 D: 单源最短路径问题

题目描述

编程实现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
import java.util.Scanner;

public class Main{

    public static void main(String[] args) {
        Scanner scan=new Scanner(System.in);
        int n=scan.nextInt();
        int v=scan.nextInt();
        int h,e;

        int maxint=1000000000;
        boolean used[]=new boolean[n];
        int dis[]=new int[n];
        int map[][]=new int[n][n];

        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
                if(i==j){
                    map[i][j]=0;
                }
            else
                map[i][j]=1000000000;
        }
        for(int i=0;i<n;i++)
            used[i]=false;
            for(int k=0;k<v;k++){
                h=scan.nextInt();
                e=scan.nextInt();
                map[h][e]= scan.nextInt();
            }
            for(int i=0;i<n;i++)
                dis[i]=map[0][i];
            int g=0;
            for(int i=0;i<n;i++){
                int tmin=maxint;
                for(int j=0;j<n;j++){
                    if(!used[j]&&dis[j]<tmin){
                        tmin=dis[j];
                        g=j;
                    }}
                    used[g]=true;
                    for(int j=0;j<n;j++)
                        if(!used[j]&&((dis[g]+map[g][j])<dis[j]))
                            dis[j]=dis[g]+map[g][j];

                }
            for(int i=0;i<n;i++)
              System.out.printf("%d ",dis[i]);
            }

    }

问题 E: ABC + DEF = GHI

题目描述

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

输入

输出

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

import java.util.Arrays;

public class Main{
	
	
	static int s[];
	static boolean b[];
public static void main(String[] args) {
	s=new int [9];
	b=new boolean[9];

    for(int i=0;i<9;i++){
    	s[i]=i+1;
    	b[i]=false;
    }
    dfs(0);
         
     
   
}

public static void dfs(int istep){
	if(istep==9){
		if(s[0]*100+s[1]*10+s[2]+s[3]*100+s[4]*10+s[5]==s[6]*100+s[7]*10+s[8]){
			int x=s[0]*100+s[1]*10+s[2];
			int y=s[3]*100+s[4]*10+s[5];
			int z=s[6]*100+s[7]*10+s[8];
			System.out.println(x+"+"+y+"="+z);
			
		}
		
	}
	for(int j=1;j<=9;j++){
		if(!b[j-1]){
			s[istep]=j;
			b[j-1]=true;
			dfs(istep+1);
			b[j-1]=false;
		}
	}
}


	
}

问题 F: 油田问题

题目描述

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

输入

多组输入
输入行数m,以及列数n。
然后输入*和@
1<=n,m<=100

输出

联通块个数

样例输入 Copy

5 5
****@
*@@*@
*@**@
@@@*@
@@**@

样例输出 Copy

2
import java.util.Scanner;

public class Main{
	
	
public static void main(String[] args) {
    Scanner in=new Scanner(System.in);
    while(in.hasNext()){
    	int n=in.nextInt();
    	int m=in.nextInt();
    	int k=0;
    	char[][] a=new char[n+5][m+5];
    	int index[][]=new int[n+5][m+5];
    	for(int i=0;i<n;i++){
    		String s=in.next();
    		for(int j=0;j<m;j++){
    			
    			a[i][j]=s.charAt(j);
    		}
    	}
    	for(int i=0;i<n;i++){
    		
    		for(int j=0;j<m;j++){
    			
    			if(a[i][j]=='@'&&index[i][j]==0){
    				slove(i,j,++k,n,m,index,a);
    			}
    		}
    	}
    	System.out.println(k);
    	
    	
    }
   
}
public static void slove(int i,int j,int k,int n,int m,int index[][],char a[][]){
	if(i<0||i>=n||j<0||j>m){
		return;
	}
	else if(index[i][j]>0||a[i][j]!='@'){
		return;
	}
	else{
		index[i][j]=k;
		for(int x=-1;x<=1;x++){
			for(int y=-1;y<=1;y++){
				if(x!=0||y!=0){
					slove(i+x,j+y,k,n,m,index,a);
				}
			}
		}
	}
}



	
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

君临๑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值