模拟+搜索

试题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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43615816/article/details/115310647