目录
1 我家的门牌号
时间限制:1000
内存限制:65536
我家住在一条短胡同里,这条胡同的门牌号从1开始顺序编号。若所有的门牌号之和减去我家门牌号的两倍,恰好等于n,求我家的门牌号及总共有多少家。数据保证有唯一解。
输入
一个正整数n。n < 100000。
输出
一行,包含两个正整数,分别是我家的门牌号及总共有多少家,中间用单个空格隔开。
样例输入
100
样例输出
10 15
解析:用for循环对门牌号逐个尝试,详情看code
不准直接抄!!!
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int n,home,x;
int i;
cin>>n;
for(i=1;; i++) //从家的门牌号开始逐个尝试
{
if((i*i+i-2*n)%4==0)
{
x=(i*i+i-2*n)/4;
if(x<=0) continue;//x不可能<1
if(x>0)//找到后
{
cout<<x<<" "<<i;//输出
return 0;//终止循环
}
}
}
return 0;
}
2 字串计算
时间限制:1000
内存限制:65536
给出一个只包含0和1的字符串(长度在1到100之间),求其每一个子串出现的次数。
输入
一行,一个01字符串。
输出
对所有出现次数在1次以上的子串,输出该子串及出现次数,中间用单个空格隔开。按子串的字典序从小到大依次输出,每行一个。
样例输入
10101
样例输出
0 2
01 2
1 3
10 2
101 2
解析:dfs深搜,上code!
不准直接抄!!!
#include <cstring>
#include <iostream>
using namespace std;
char a[105], s[101];
void dfs(int n) //dfs深搜
{
int h = 0;
for (int i = 0; i <= strlen(a) - n; i++)//i<=字符数组a的长度
{
int f = 1;
for (int j = 0; j < n; j++)
{
if (a[i + j] != s[j])
{
f = 0;
break;
}
}
h += f;
}
if (h <= 1)
return;//返回
for (int i = 0; i < n; i++)
cout << s[i];
cout << ' ' << h << endl;
s[n] = '0';
dfs(n + 1);
s[n] = '1';
dfs(n + 1);
}
int main() {
cin >> a;
s[0] = '0';
dfs(1);
s[0] = '1';
dfs(1);
}
3 吃糖果
时间限制:1000
内存限制:65536
名名的妈妈从外地出差回来,带了一盒好吃又精美的巧克力给名名(盒内共有 N 块巧克力,20 > N >0)。妈妈告诉名名每天可以吃一块或者两块巧克力。假设名名每天都吃巧克力,问名名共有多少种不同的吃完巧克力的方案。例如:如果N=1,则名名第1天就吃掉它,共有1种方案;如果N=2,则名名可以第1天吃1块,第2天吃1块,也可以第1天吃2块,共有2种方案;如果N=3,则名名第1天可以吃1块,剩2块,也可以第1天吃2块剩1块,所以名名共有2+1=3种方案;如果N=4,则名名可以第1天吃1块,剩3块,也可以第1天吃2块,剩2块,共有3+2=5种方案。现在给定N,请你写程序求出名名吃巧克力的方案数目。
输入
输入只有1行,即整数N。
输出
输出只有1行,即名名吃巧克力的方案数。
样例输入
4
样例输出
5
解析:循环,上code!
不准直接抄!!!
#include<iostream>
using namespace std;
long long a[75];
int main() {
int n;
a[1] = 1;
a[2] = 2;
a[3] = 4;
for (int i = 4; i <= 71; i++)
a[i] = a[i - 1] + a[i - 2] + a[i - 3];
while (cin >> n && n)
cout << a[n] << endl;
return 0;
}
4 拨钟问题
拨钟问题
有9个时钟,排成一个3*3的矩阵。
现在需要用最少的移动,将9个时钟的指针都拨到12点的位置。共允许有9种不同的移动。如下表所示,每个移动会将若干个时钟的指针沿顺时针方向拨动90度。
移动 影响的时钟
1 ABDE
2 ABC
3 BCEF
4 ADG
5 BDEFH
6 CFI
7 DEGH
8 GHI
9 EFHI
输入
9个整数,表示各时钟指针的起始位置,相邻两个整数之间用单个空格隔开。其中,0=12点、1=3点、2=6点、3=9点。
输出
输出一个最短的移动序列,使得9个时钟的指针都指向12点。按照移动的序号从小到大输出结果。相邻两个整数之间用单个空格隔开。(数据保证答案唯一)
样例输入
3 3 0
2 2 2
2 1 2
样例输出
4 5 8 9
解析:本题用枚举法解决,详情看code
不准直接抄!!!
#include<iostream>
#include<cstring>
using namespace std;
int main(){
int oriClock[10] = { 0 };//初始时钟状态
int curClock[10] = { 0 };//当前时钟状态
int move[10] = { 0 };//移动操作次数
for (int i = 1; i < 10; ++i)//读入
cin >> oriClock[i];
for (move[1] = 0; move[1] < 4; ++move[1])
{
for (move[2] = 0; move[2] < 4; ++move[2])
{
for (move[3] = 0; move[3] < 4; ++move[3])
{
//枚举第一层的1,2,3号钟操作
memcpy(curClock, oriClock, sizeof(oriClock));/*memcpy函数的功能是
从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址
的起始位置中*/
//1,2,3号钟操作对本层状态的影响
curClock[1] = (curClock[1] + move[1] + move[2]) % 4;
curClock[2] = (curClock[2] + move[1] + move[2] + move[3]) % 4;
curClock[3] = (curClock[3] + move[2] + move[3]) % 4;
//1,2,3号钟操作对下一层状态的影响
curClock[4] = (curClock[4] + move[1]) % 4;
curClock[5] = (curClock[5] + move[1] + move[3]) % 4;
curClock[6] = (curClock[6] + move[3]) % 4;
//1,2,3号钟状态决定下层的操作
move[4] = (4 - curClock[1]) % 4;
move[5] = (4 - curClock[2]) % 4;
move[6] = (4 - curClock[3]) % 4;
//4,5,6号钟操作对本层状态的影响
curClock[4] = (curClock[4] + move[4] + move[5]) % 4;
curClock[5] = (curClock[5] + move[5]) % 4;
curClock[6] = (curClock[6] + move[5] + move[6]) % 4;
//4,5,6号钟操作对下一层状态的影响
curClock[7] = (curClock[7] + move[4]) % 4;
curClock[8] = (curClock[8] + move[5]) % 4;
curClock[9] = (curClock[9] + move[6]) % 4;
//4,6号钟状态决定下层7,9的操作
move[7] = (4 - curClock[4]) % 4;
move[9] = (4 - curClock[6]) % 4;
//7,9号钟操作对5号钟状态的影响
curClock[5] = (curClock[5] + move[7] + move[9]) % 4;
//7,9号钟操作对本层状态的影响
curClock[7] = (curClock[7] + move[7]) % 4;
curClock[8] = (curClock[8] + move[7] + move[9]) % 4;
curClock[9] = (curClock[9] + move[9]) % 4;
//8号钟状态决定8号钟的操作
move[8] = (4 - curClock[8]) % 4;
//8号钟操作对本层状态的影响
curClock[7] = (curClock[7] + move[8]) % 4;
curClock[9] = (curClock[9] + move[8]) % 4;
if (curClock[5] + curClock[7] + curClock[9] == 0)//判断条件:5,7,9号钟
{
for (int i = 1; i < 10; ++i)
{
while (move[i]--)
cout << i << " ";
}
return 0;
}
}
}
}
return 0;
}
5 方形盒
时间限制:1000
内存限制:65536
分形,通常被定义为一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状,即具有自相似的性质。它跟分数维、自组织、非线性系统和混沌等具有非常重要的联系。分形盒就是这样一种分形,它的定义如下:
维度是1的分形盒:
X
维度是2的分形盒:
X X
X
X X
如果已知维度是(n-1)的分形盒,那么维度是n的分形盒的递归定义如下所示:
Box(n-1) Box(n-1)
Box(n-1)
Box(n-1) Box(n-1)
你的任务是画一个维度为n的分形盒。
输入
输入包含多组测试数据。每一行包含一个正整数n表示分形盒的维度,n不大于7;最后一行是一个-1,表示输入结束。
输出
对于每组测试数据,输出要求维度的分形盒,注意X为大写字母。每组测试数据之后包含一行,改行只包含一个破折号。
样例输入
1
2
3
4
-1
样例输出
X
-
X X
X
X X
-
X X X X
X X
X X X X
X X
X
X X
X X X X
X X
X X X X
-
X X X X X X X X
X X X X
X X X X X X X X
X X X X
X X
X X X X
X X X X X X X X
X X X X
X X X X X X X X
X X X X
X X
X X X X
X X
X
X X
X X X X
X X
X X X X
X X X X X X X X
X X X X
X X X X X X X X
X X X X
X X
X X X X
X X X X X X X X
X X X X
X X X X X X X X
-
解析:本题用递归就能解决,详情看code
不准直接抄!!!
#include <iostream>
#include <cmath>//调用后面的pow函数,也可用#include <math.h>
#include <string.h>//调用memset
using namespace std;
char a[2200][2200];
void draw(int x, int y, int n)
{ //左上角为x,y,画一个层数为n的分型盒
if (n == 0)
{
a[x][y] = 'X';
return;//返回
}
draw(x, y, n - 1); //左上
draw(x, y + 2 * pow(3, n - 1), n - 1);//右上
draw(x + 2 * pow(3, n - 1), y, n - 1); //左下
draw(x + 2 * pow(3, n - 1), y + 2 * pow(3, n - 1), n - 1); //右下
draw(x + pow(3, n - 1), y + pow(3, n - 1), n - 1);//中
}
int main() {
int n;
while (1)
{
memset(a, 0, sizeof(0));/*将数值0以单个字节逐个拷贝的
方式放到指针变量a所指的内存中去。*/
cin >> n;
if (n == -1)
break;//跳出循环
draw(1, 1, n - 1);//调用darw
for (int i = 1; i <= pow(3, n - 1); i++)
{
for (int j = 1; j <= pow(3, n - 1); j++)
{
if (a[i][j] == 0)
cout << " ";
else
cout << "X";
}
cout << endl;
}
cout << "-" << endl;
}
return 0;
}
作者制作不易,喜欢就用你发财的小手给作者点个赞,点个关注吧!