蓝桥杯真题New OJ(未完)

本人NewOJ 672名的废物(实时更新)
QQ:1736491492 我写出来的题目都可以问我

1250 方程整数解

暴力循环即可

1251 星系炸弹

依题意 三个变量y m d表示年月日

先用二维数组存进去每个月份的天数(共2+二十四钟月份天数)
然后过一天 n-- d ++ 判断m 和 d是不是合法的范围 进位

int main()
{
    int y, m, d, n;
    //二维数组表示 非闰年的每月天数,闰年的每月天数
    int leap[2][13] = {0,31,28,31,30,31,30,31,31,30,31,30,31,
                        0,31,29,31,30,31,30,31,31,30,31,30,31};

    while(cin >> y >> m >> d >> n) //输入年月日 以及每一天
    {
        while(n > 0)
        {
            //判断是不是闰年 是闰年t为1 不是则为0
            int t = (y%4 == 0 && y%100 != 0) || y%400 == 0;
            n --;
            d ++;
            if(d > leap[t][m]) //如果天数 超过了当前月份的天数 月份加1,天数置为1
            {
                d = 1;
                m ++;
            }
            if(m == 13) //如果月份超过了 13 年数加1,月份置为1
            {
                m = 1;
                y ++;
            }
        }
        
        //输出格式要求
        if(m < 10 && d < 10)
            printf("%d-0%d-0%d\n",y,m,d);
        else if(m < 10)
            printf("%d-0%d-%d\n",y,m,d);
        else if(d < 10)
            printf("%d-%d-0%d\n",y,m,d);
        else
            printf("%d-%d-%d\n",y,m,d);
    }
    return 0;
}

1252 奇妙的数字(未写 周末补)

做题前估测是两位数
平方 四位数 立方 六位数
但是怎么暴力 我不太会简单方法

1253 牌型总数

1.枚举1~k每张牌的数量
十三个变量暴力

2.采用dfs深度优先搜索暴力的方法 也就是对总数量和总种类搜索

int ans;
void dfs(int cnt,int k) // 数量 种类
{
    if(cnt == 13) //cnt = 13满足题意 答案加1
        ans ++;
    if(cnt == 13 || k == 13) //cnt = 13或 k也搜索完成 return;
        return ;
    for(int i = 0; i <= 4; i ++) //每张牌可以是0~4张
        dfs(cnt+i, k+1);
}
int main()
{
    dfs(0,0);
    cout << ans << endl;
    return 0;
}

1254 手链样式 (未写 周末补)


1255 饮料换购

模拟题
变量记录n/3 n%3

while(cin >> n){
        int ans = n;
        while(n>=3)
        {
            int a = n/3, b = n%3;
            n = a+b;
            ans += a;
        }
        cout << ans << endl;
    }

1256 垒骰子 (未写 周末补)

dp+滚动数组

1257 灾后重建 (未写)

图论

1258 奖券数目

将五位数 每一位数存入数组
判断数组有没有4 即可

1259 三羊献瑞

用全排列next_permutation即可

int s[] = {0,1,2,3,4,5,6,7,8,9};
int main()
{

    do
    {
        int a = s[0]*10000+s[1]*1000+s[2]*100+s[3]*10+s[4];
        int b = s[0]*1000+s[1]*100+s[6]*10+s[3];
        int c = s[5]*1000+s[3]*100+s[2]*10+s[7];

        if(s[0] != 0 && a == b + c)
            cout << b << endl;

    }while(next_permutation(s,s+10));
    return 0;
}

1260 加法变乘法

变换题目的比如得:
    (1+2+3+...+49)-10-11-27-28+10x11+27x28=2015
  故只需找出两个整数x,y(x<y) 使得:
    (1+2+3+...+49)-x-(x+1)-y-(y+1)+x*(x+1)+y*(y+1)=2015
  
  枚举法 即可
  
  for(int i = 1; i <= 49; i ++)
    {
        for(int j = i+2; j <= 49; j ++)
        {
            if(1225-2*i-1+i*(i+1)-2*j-1+j*(j+1) == 2015)
                cout << i << endl;
        }
    }

1261 移动距离

算出编号的行、列 然后做减法即可

1262 生命之树

1263 打印大X

模拟题
可以观察出共有m行 每列有m+n-1个元素

采用bool数组 .存false  *存true

int m, n;
    while(cin >> m >> n)
    {
        for(int i = 0; i < (n-1)/2; i ++)
        {
            int l = i+1, r = m+n-l;
            for(int j = 0; j < m; j ++) //依次赋值
            {
                a[l+j] = true;
                a[r-j] = true;
            }

            for(int j = 1; j <= m+n-1; j ++)
            {
                if(a[j] == false) cout << ".";
                else cout << "*";
                
                a[j] = false; //复原
            }
            cout << endl;
        }
        for(int i = (n-1)/2; i < n; i ++)
        {
            int l = n-i, r = m+n-l;
            for(int j = 0; j < m; j ++)
            {
                a[l+j] = true;
                a[r-j] = true;
            }

            for(int j = 1; j <= m+n-1; j ++)
            {
                if(a[j] == false) cout << ".";
                else cout << "*";

                a[j] = false;
            }
            cout << endl;
        }
    }

1264 方格填数

总结下:只要是填数问题 都可以用全排列做

int d[] = {0,1,2,3,4,5,6,7,8,9};

int main()
{
    int ans = 0;
    do
    {
        bool flag = true;
        for(int i = 0; i <= 3; i ++) //使用排除法 用循环可以不用写出每一项小于
            if(d[i] > d[i+1] || d[i] > d[i+5])
                flag = false;
        if(d[4] > d[9]) flag = false;
        for(int i = 5; i <= 8; i ++)
            if(d[i] > d[i+1])
                flag = false;
        if(flag) ans++;

    }while(next_permutation(d,d+10));
    cout << ans << endl;
    return 0;
}

1265 四阶幻方 (未优化)

同理 全排列 但是程序运行时间比较长 应该是需要优化的

int a[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};

int main()
{
    int ans = 0;
    do
    {
        int sum1= a[0]+a[1]+a[2]+a[3];
        int sum2= a[4]+a[5]+a[6]+a[7];
        int sum3= a[8]+a[9]+a[10]+a[11];
        int sum4= a[12]+a[13]+a[14]+a[15];
        if(sum1 != sum2 || sum1 != sum3 || sum1 != sum4)
            continue;

        int sum5= a[0]+a[4]+a[8]+a[12];
        int sum6= a[1]+a[5]+a[9]+a[13];
        int sum7= a[2]+a[6]+a[10]+a[14];
        int sum8= a[3]+a[7]+a[11]+a[15];
        if(sum5 != sum6 || sum5 != sum7 || sum5 != sum8)
            continue;

        int diag1 = a[0]+a[5]+a[10]+a[15];
        int diag2 = a[3]+a[6]+a[9]+a[12];
        if(diag1 != diag2)
            continue;

        if(a[0] == 1)
            ans ++;
        cout << ans << endl;
    }while(next_permutation(a,a+16));
    cout << ans << endl;
    return 0;
}

1266 穿越雷区

本题dfs以及bfs都可以做

//dfs写法 需要剪枝

const int N = 110;
int n;
int x1,x2,y1,y2; //记录起始点(x1,y1),终点(x2,y2)
int ans = 0x3f3f3f3f;

char a[N][N];
int d[N][N];
int dx[] = {-1,0,1,0},dy[] = {0,1,0,-1};

void dfs(int x,int y,int k)
{
    if(k > ans) return ;//如果k > ans 就没必要走下去了
    if(x == x2 && y == y2)
    {
        ans = k;
        return ;
    }
    for(int i = 0; i < 4; i ++)
    {
        int xx = x+dx[i],yy = y+dy[i];
        if(xx >= 1 && xx <= n && yy >= 1 && yy <= n && d[xx][yy] == 0)
        {
            if(a[x][y] == '+' && a[xx][yy] == '+') continue;
            if(a[x][y] == '-' && a[xx][yy] == '-') continue;
            d[xx][yy] = 1;
            dfs(xx,yy,k+1);
            d[xx][yy] = 0;  //恢复现场
        }
    }

}
int main()
{
    cin >> n;
    for(int i = 1; i <= n; i ++)
        for(int j = 1; j <= n; j ++)
    {
        cin >> a[i][j];
        if(a[i][j] == 'A')
            x1 = i,y1 = j;
        if(a[i][j] == 'B')
            x2 = i,y2 = j;
    }
    dfs(x1,y1,0);
    if(ans == 0x3f3f3f3f) puts("-1");
    else cout << ans << endl;
    return 0;
}


//bfs写法

const int N = 110;
int n;
int x1,x2,y1,y2;

char a[N][N];
int d[N][N];
int dx[] = {-1,0,1,0},dy[] = {0,1,0,-1};

typedef pair<int,int> PII;
queue<PII> q;

int bfs()
{
    memset(d,-1,sizeof(d));
    d[x1][y1] = 0;
    q.push({x1,y1});

    while(q.size())
    {
        auto t = q.front();
        q.pop();
        int x = t.first,y = t.second;
        if(x == x2 && y == y2)
        {
            return d[x][y];
        }
        for(int i = 0; i < 4; i ++)
        {
            int xx = x+dx[i], yy = y+dy[i];

            if(xx >= 1 && xx <= n && yy >= 1 && yy <= n && d[xx][yy] == -1)
            {
                if(a[x][y] == '+' && a[xx][yy] == '+') continue;
                if(a[x][y] == '-' && a[xx][yy] == '-') continue;
                d[xx][yy] = d[x][y]+1;
                q.push({xx,yy});
            }
        }
    }
    return -1;
}
int main()
{
    cin >> n;
    for(int i = 1; i <= n; i ++)
        for(int j = 1; j <= n; j ++)
    {
        cin >> a[i][j];
        if(a[i][j] == 'A')
            x1 = i,y1 = j;
        if(a[i][j] == 'B')
            x2 = i,y2 = j;
    }
    cout << bfs() << endl;
    return 0;
}

1282 网友年龄

暴力即可
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

衣谷金锋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值