首页 > 其他分享 >PAT 2023 冬 乙 方格填数

PAT 2023 冬 乙 方格填数

时间:2024-03-23 21:44:36浏览次数:20  
标签:10 13 PAT 16 int 15 填数 2023 20

题目描述

B-4 方格填数 分数 20 作者 陈越 单位 浙江大学

2014 年哈佛-麻省理工数学竞赛中一道题是这样的:将正整数 1, 2, ..., 64 填入 8×8 的方格棋盘中,使得对任何 1≤i<64,i 和 i+1 都必须填在两个具有公共边的方格中。求棋盘上对角线中所填数的和的最大值。(注意:两个对角线都要考虑;64 和1 也必须填在两个具有公共边的方格中。)
这题有点难…… 幸好我们并不要求你写程序解决这个问题。
你的任务是:对任一给定的数字填充方案,判定其是否满足填充的条件,并且在所有给出的方案中,找出满足条件的、且对角线数字和最大的那个方案。

输入格式:

输入在一行中首先给出两个正整数 n(≤100) 和 m(≤20),分别为棋盘的规模(即棋盘有 n×n 个方格)和输入的方案数量。因为容易证明奇数 n 一定不存在满足条件的解,所以题目保证给出的 n 都是偶数。
随后给出 m 个填充方案,每个方案占 n 行,每行 n 个不超过 n2 的数字。同行数字间以空格分隔。

输出格式:

在一行中首先输出满足条件的、且对角线数字和最大的方案数。随后一行中按照递增序输出这些方案的编号(编号按输入的顺序从 1 到 m)。
注意每行数字间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

4 5
16 1 2 3
15 14 13 4
10 11 12 5
9 8 7 6
16 1 2 3
15 14 13 4
10 11 12 5
9 8 7 10
15 16 1 2
14 13 4 3
11 12 5 6
10 9 8 7
3 4 5 6
2 13 12 7
1 14 11 8
16 15 10 9
10 5 4 3
7 12 13 2
8 11 14 1
9 6 15 16

输出样例:

2
1 4
代码长度限制 16 KB Java (javac) 时间限制 1100 ms 内存限制 256 MB 其他编译器 时间限制 400 ms 内存限制 64 MB 栈限制 8192 KB  

代码:

 
// 20:01 ~ 20:16

// 好像忘记判断是否满足条件了 
//== > 19 / 20
// dfs 判断一下,byd,测力4格式错误 
#include <iostream>
#include <vector>
using namespace std;
const int N = 105;

int n,m;
int A[N][N];
int dir[4][2] = { {0,1},{0,-1},{1,0},{-1,0} };

bool bfs(int h,int l,int val){
    int tag = 0;
    if(val == n * n)
        val = 0;
    for(int i=0;i<=3;i++){
        int x = dir[i][0] + h;
        int y = dir[i][1] + l;
        if(x >= 1 && x <= n && y >= 1 && y <= n){
            if(A[x][y] == (val+1) ){
                tag = 1;
                if(val == 0) return 1;
                return bfs(x,y,val+1) & tag;
            }
        }
    }
    return tag;
}


bool check(int row,int con){
    return bfs(row,con,1);
}

int main(){
    cin >> n >> m;
    vector<pair<int,int>> ve;
    int mx = -0x7fffffff;
    for(int z = 1;z<=m;z++){
        int row=-1,con=-1;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                cin >> A[i][j];
                if(A[i][j] == 1){
                    row = i;
                    con = j;
                }
            }
        }
        // 判断是否满足条件
        if(!check(row,con)) {
            continue;
        }
        
        // 求对角线元素 
        int sum1 = 0;
        int sum2 = 0;
        for(int i=1;i<=n;i++){
            sum1 += A[i][i];
            sum2 += A[i][n-i+1];
        }
        int sum = max(sum1,sum2);
        ve.push_back(make_pair(z,sum));    
        if(sum > mx) mx = sum;
    }
    vector <int> v;
    for(int i=0;i<ve.size();i++){
        if(ve[i].second == mx){
            v.push_back(ve[i].first);
        }
    }
    
    if(v.size() == 0){
        cout << "0";
        return 0;
    }
    cout << v.size() <<endl;
    int ans = 0;
    for(auto i : v){
        if(ans != 0)
        cout << " " << i;
        else cout << i;
        ans ++;
    }
    
    
    return 0;
}

 

奇怪的测试点

案例四显示格式错误,也不知道哪错了

 

 

标签:10,13,PAT,16,int,15,填数,2023,20
From: https://www.cnblogs.com/lordtianqiyi/p/18091728

相关文章

  • P9871 [NOIP2023] 天天爱打卡
    P9871[NOIP2023]天天爱打卡经典dp+线段树优化+离散化前两个步骤略讲,主要是离散化。首先考虑dp,朴素的,容易写出状态\(f_i\)表示考虑到第\(i\)个位置,且强制第\(i\)天跑步的最大能量值。考虑枚举最后一段跑步的时间,有\(f_i=\max(\max\limits_{k<j}f_k-(i-j)\timesd+\sum......
  • [暴力题解系列]2023年蓝桥杯-子串简写
    ​ 大伙都说暴力是最低级的算法,啊那确实。但是好的暴力才是真正牛逼的骗分。咱就是说,暴力如何骗分呢?就是基于最暴力的算法一步步优化到能得更多分的暴力。子串简写这题,首先第一步就能想到一件事情:暴力枚举子串开头和末尾的位置,检查是否是符合题目要求的字符,如果是,并且长度大于......
  • 2023年红蓝对抗-HW蓝队基本知识点
    1.Linux排查思路(1)首先检测用户账号安全,如新增用户和可疑用户以及高权限用户。(2)history命令查看历史linux指令,uptime查看用户登录信息(3)检查端口(netstat命令)和进程(ps命令),重点观察资源占用率高的进程(4)检查日志信息,var/log文件夹内的一些系统日志和安全日志。(5)利用自动......
  • 机器学习金融预测领域2023部分综述论文阅读记录
    23年的综述最近读了3篇,总结笔记如下:本期所有论文链接:2023综述https://www.alipan.com/s/ySur3StxKip点击链接保存,或者复制本段内容,打开「阿里云盘」APP,无需下载极速在线查看,视频原画倍速播放。(2023)A_Systematic_Survey_of_AI_Models_in_Financial_Mark评价:原文写的一般,可以......
  • xpath和contains模糊匹配
    来源:https://www.cnblogs.com/kaibindirver/p/12072546.html最近在弄数据爬取,研究了下xpath,也参考了很多文章,这篇总结不错,就直接复制过来了。xpath可以以标签定位,也可以@任意属性:如:以input标签定位:driver.find_element_by_xpath("//input[@id='kw']")如:@type属性:driver.find_......
  • PAT乙级 1062 最简分数 C语言
    最简分数一个分数一般写成两个整数相除的形式:N/M,其中M不为0。最简分数是指分子和分母没有公约数的分数表示形式。现给定两个不相等的正分数N1​/M1​和N2​/M2​,要求你按从小到大的顺序列出它们之间分母为K的最简分数。输入格式:输入在一行中按N/M的格式给出两个......
  • PAT乙级 1055 集体照 C语言
    集体照拍集体照时队形很重要,这里对给定的N个人K排的队形设计排队规则如下:每排人数为N/K(向下取整),多出来的人全部站在最后一排;后排所有人的个子都不比前排任何人矮;每排中最高者站中间(中间位置为m/2+1,其中m为该排人数,除法向下取整);每排其他人以中间人为轴,按身高......
  • PAT乙级 1054 求平均值 C语言
    本题的基本要求非常简单:给定N个实数,计算它们的平均值。但复杂的是有些输入数据可能是非法的。一个“合法”的输入是[−1000,1000]区间内的实数,并且最多精确到小数点后2位。当你计算平均值的时候,不能把那些非法的数据算在内。输入格式:输入第一行给出正整数N(≤100)。随......
  • SpringBoot 面向面试学习(2023.03.23更新)
    导语在网上找了很多SpringBoot相关的教程,要么是针对初学者面向实战入门的视频,要么基于面试但存在收费或不全面的问题……因此参考网上博客特此总结了一些可能常见的面试题,循序渐进,以问题为导向,以面试为场景进行学习/复习。JavaGuide提供的Spring常见面试题总结可以去看,里面......
  • #17 2023.3.18
    645.loj4038「SNOI2024」树V图646.loj4039「SNOI2024」矩阵647.loj4040「SNOI2024」拉丁方648.loj4041「SNOI2024」平方数649.loj4042「SNOI2024」公交线路650.loj3903「PA2022」Palindrom651.loj3904「PA2022」WielkiZderzaczTermionów652.loj......