Login to join training plan
题目:# [GESP样题 四级] 填幻方
题目描述
在一个 N×N 的正方形网格中,每个格子分别填上从 1 到 N×N 的正整数,使得正方形中任一行、任一列及对角线的几个数之和都相等,则这种正方形图案就称为“幻方”(输出样例中展示了一个 3×3 的幻方)。我国古代称为“河图”、“洛书”,又叫“纵横图”。
幻方看似神奇,但当 N 为奇数时有很方便的填法:
- 一开始正方形中没有填任何数字。首先,在第一行的正中央填上 1。
- 从上次填数字的位置向上移动一格,如果已经在第一行,则移到同一列的最后一行;再向右移动一格,如果已经在最右一列,则移动至同一行的第一列。如果移动后的位置没有填数字,则把上次填写的数字的下一个数字填到这个位置。
- 如果第 2 步填写失败,则从上次填数字的位置向下移动一格,如果已经在最下一行,则移到同一列的第一行。这个位置一定是空的(这可太神奇了!)。把上次填写的数字的下一个数字填到这个位置。
- 重复 2、3 步骤,直到所有格子都被填满,幻方就完成了!
快来编写一个程序,按上述规则,制作一个 N×N 的幻方吧。
##输入格式
输入为一个正奇数 N,保证 3≤N≤21。
##输出格式
输出 N 行,每行 N 个空格分隔的正整数,内容为 N×N 的幻方。
##输入输出样例
输入 #1
3
输出 #1
8 1 6
3 5 7
4 9 2
代码参考:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <bitset>
#include <utility>
#include <sstream>
#include <ctime>
#include <cassert>
#include <limits>
#include <unordered_map>
#include <unordered_set>
#include <functional>
#include <numeric>
#include <iomanip>
#include <array>
#include <tuple>
#include<bits/stdc++.h>
using namespace std;
int a[25][25];
int main(){
int n;
cin>>n;
int x=0,y=n/2;
a[x][y]=1;
for(int i=2;i<=n*n;i++){
int tx=(x+n-1)%n;
int ty=(y+1)%n;
if(a[tx][ty]==0){
a[tx][ty]=i;
}else{
tx=(x+1)%n;
ty=y;
a[tx][y]=i;
}
x=tx;
y=ty;
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++) cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}
题目:[GESP样题 六级] 下楼梯
题目描述
顽皮的小明发现,下楼梯时每步可以走 1 个台阶、2 个台阶或 3 个台阶。现在一共有 N 个台阶,你能帮小明算算有多少种方案吗? 输入格式:
输入一行,包含一个整数 N。 输出格式:
输出一行一个整数表示答案。 输入输出样例:
输入 #1
4
输出 #1
7
输入 #2
10
输出 #2
274
说明/提示
对全部的测试点,保证 1≤N≤60。
思路: 就是让你求下 n 级台阶时有一次下一级,一次下两级,一次下三级这三种方式,一共多少种走法,且顺序不同也算两种哦!要注意。
递推思路
就是一个简单的递推题,当 n=1 时,那当然就是直接下一级台阶,当 n=2 时,可以直接下两级,也可以下两个一级,当 n=3 时,可以下三级,也可以先下一级再下两级,也可以先下两级后再下一级,也可以连续下三个一级,后面楼梯级数每增加一级方案数就是数组前三个元素的和,可得以下公式:
aj**=aj−1+aj−2+aj−3**其实这个公式是很容易得到的,因为一次最多下三级楼梯,所以从上往下数第 j 级楼梯可以从上面三级中任意一级走过来,自然就可以得到是方案数是上面三级楼梯方案数的和。
代码参考:
#include<bits/stdc++.h>
using namespace std;
long long a[1001];
int n;
int main(){
cin>>n;
a[0]=1;
a[1]=2;
a[2]=4;
for(int j=3;j<n;j++){
a[j]=(a[j-1]+a[j-2]+a[j-3]);
}
cout<<a[n-1]<<endl;
return 0;
}
[GESP样题 四级] 绝对素数:
题目描述:
如果一个两位数是素数,且它的数字位置经过对换后仍为素数,则称为绝对素数,例如 13。给定两个正整数 A,B,请求出大于等于 A、小于等于 B 的所有绝对素数。
输入格式:
输入 1 行,包含两个正整数 A 和 B。保证 10<A<B<100。
输出格式:
若干行,每行一个绝对素数,从小到大输出。
输入输出样例:
输入 #1
11 20
输出 #1
11
13
17
题解:
#include<bits/stdc++.h>
using namespace std;
int oppo(int n){
int a=n%10,b=n/10;
if(n%2!=0&&n%3!=0&&n%5!=0&&n%7!=0){
return n;
}
else if((a+b*10)%2!=0&&(a+b*10)%3!=0&&(a+b*10)%5!=0&&(a+b*10)%7!=0){
return n;
}else{
return 0;
}
}
int main(){
int a,b;
cin>>a>>b;
for(int i=a;i<=b;i++){
if(oppo(i)!=0){
cout<<oppo(i)<<endl;
}
}
}
[GESP样题 六级] 亲朋数:
题目描述:
如果一个两位数是素数,且它的数字位置经过对换后仍为素数,则称为绝对素数,例如 13。给定两个正整数 A,B,请求出大于等于 A、小于等于 B 的所有绝对素数。
输入格式:
输入 1 行,包含两个正整数 A 和 B。保证 10<A<B<100。
输出格式:
若干行,每行一个绝对素数,从小到大输出。
输入输出样例:
输入 #1复制
11 20
输出 #1复制
11
13
17
[GESP样题 三级] 逛商场:
题目描述:
小明是个不太有计划的孩子。这不,刚到手的零花钱,就全部拿着逛商场去了。
小明的原则很简单,见到想买的物品,只要能买得起,就一定会买下来之后才会继续往前走;如果买不起就直接跳过。
一天下来,小明到底买了多少物品呢?
输入格式:
输入共 3 行:
第一行是一个整数 N,表示商场中共有 N 种小明想买的物品(1≤N≤100);
第二行共有 N 个整数,分别表示小明先后见到想买的物品的价格;
第三行是一个整数 X,表示开始时小明共有 X 元零花钱。
输出格式:
输出 1 行,包含一个整数,表示小明买到的物品数。
输入输出样例:
输入 #1复制
6
7 5 9 10 7 4
30
输出 #1复制
4
说明/提示:
数据范围:
对于 100% 的数据满足 1≤N≤100 且 0≤ai≤100000
思路分析:
本题考查循环结构和分支结构。
因为本题的金额总数在最后读入,所以我们需要用数组 a 来储存每个商品的金额,随后根据题目进行 n 次循环进行判断:
- 如果商品 i 的价格 ai 比 x 小,就意味着能买得起它,将总金额减去 ai,并将买到的商品总数 ans 加上 1;
- 如果买不起,直接跳过。
核心代码:
循环 n 次,如果 ai 比 x 小,将 x 减去 ai,答案加 1,否则跳过:
for (int i = 1; i <= n; i++) {
if (a[i] <= x)
x -= a[i], ans++;
else
continue;
}
注意事项
- 变量 ans 的初值记得设为 0;
- 不能边读边操作,因为金额在最后读入。
- 提交链接luogu.com.cn/B3848
- Enrollees
- 4
- Created By