KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的菱形图案。
多组输入,一个整数(2~20)。
针对每行输入,输出用“*”组成的菱形,每个“*”后面有一个空格。每输出一个菱形的后面需要空一行。
2 3 4
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
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。
输出第一天蛋糕的数量。
2 4
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
多组输入,输入一个整数。
输出分解后的字符串。
6
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到每一个顶点的最短路径长度。
5 7 0 1 10 0 3 30 0 4 100 1 2 50 2 4 10 3 2 20 3 4 60
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()
用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列的字符矩阵,统计字符“@”组成多少个八连块。如果两个字符“@”所在的格子相邻(横、竖或者对角线方向),即属于同一个八连块。
<span style="background-color:#ffffff"><span style="color:#333333"><span style="color:#333333"><span style="background-color:#f5f5f5">5 5
****@
*@@*@
*@**@
@@@*@
@@**@</span></span></span></span>
<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;
}
?