试题C 蛇形填数
【问题描述】
如下图所示,小明用从1 开始的正整数“蛇形”填充无限大的矩阵。
容易看出矩阵第二行第二列中的数是5。请你计算矩阵中第20 行第20 列的数是多少?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
#include<bits/stdc++.h>
using namespace std;
//!accounting for my perspective : simulation and find the relationship between rows and columns.
int a[100][100],cnt=1,x=1,y=1,t=0;
int main()
{
a[x][y]=cnt++;//!x:row y:columns
while(cnt<1000){
a[x][++y]=cnt++;t++;
for(int i=0;i<t;i++)a[++x][--y]=cnt++;
a[++x][y]=cnt++;t++;
for(int i=0;i<t;i++)a[--x][++y]=cnt++;
}
return cout<<a[20][20]<<endl,0;
}
输出:761
试题D 跑步锻炼
【问题描述】
小蓝每天都锻炼身体。
正常情况下,小蓝每天跑 1 千米。如果某天是周一或者月初(1 日),为了
激励自己,小蓝要跑 2 千米。如果同时是周一或月初,小蓝也是跑 2 千米。
小蓝跑步已经坚持了很长时间,从 2000 年 1 月 1 日周六(含)到 2020 年
10 月 1 日周四(含)。请问这段时间小蓝总共跑步多少千米?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
#include<bits/stdc++.h>
using namespace std;
//!Winner approaching, spring will be around the corner.
int m1[15]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int m2[15]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int ex,week_days=6;//exercise_days
int judge(int year)
{
if((year%4==0&&year%100!=0)||year%400==0)return 1;
return 0;
}
int main()
{
for(int y=2000;y<=2020;y++){
int max_month=12;
if(y==2020)max_month=10;
for(int m=1;m<=max_month;m++){
int max_days=judge(y)?m2[m]:m1[m];
if(y==2020&&m==10)max_days=1;
for(int d=1;d<=max_days;d++){
ex+=(week_days==1||d==1)?2:1;
week_days=(week_days+1)%7;//Sunday: 0
}
}
}
return cout<<ex<<endl,0;
}
试题E 七段码
【问题描述】
小蓝要用七段码数码管来表示一种特殊的文字。
七段码上图给出了七段码数码管的一个图示,数码管中一共有7 段可以发光的二极管,分别标记为a, b,
c, d, e, f, g。小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符的表达时,要求
所有发光的二极管是连成一片的。
例如:b 发光,其他二极管不发光可以用来表达一种字符。
例如:c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上一行的方案可以用来表示不同
的字符,尽管看上去比较相似。
例如:a, b, c, d, e 发光,f, g 不发光可以用来表达一种字符。
例如:b, f 发光,其他二极管不发光则不能用来表达一种字符,因为发光的二极管没有连成一片。
请问,小蓝可以用七段码数码管表达多少种不同的字符?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
#include<bits/stdc++.h>
using namespace std;
//路径去重:1.并查集去重 2.使用set保存路径去重 3.类似字符串哈希去重
int e[20][20],vis[20];//edge
set<set<int>>se;//set 去重路径
void dfs(int x,set<int>s)
{
if(se.count(s)==0)se.insert(s);
if(s.size()==7)return ;
for(int i=1;i<=7;i++){
if(!e[x][i]||vis[i])continue;
s.insert(i);vis[i]=1;//insert path
dfs(i,s);
vis[i]=0;s.erase(i);//recall
}
}
void add(int x,int y)// a:1 b:2 c:3 d:4 e:5 f:6 g:7
{
e[x][y]=1; e[y][x]=1;
}
void init()
{
add(1,2);add(1,6);//a
add(2,7);add(2,3);//b
add(3,4);add(3,7);//c
add(4,5);//d
add(5,6);add(5,7);//e
add(6,7);//f
}
int main()
{
init();
set<int>s;
for(int i=1;i<=7;i++){//以每条边为起始搜一遍
s.insert(i);vis[i]=1;
dfs(i,s);
vis[i]=0;s.erase(i);
}
return cout<<se.size()<<endl,0;
}