问题 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);
}
}
}
}
}
}