专栏文章

题解:P14358 [CSP-J 2025] 座位 / seat(民间数据)

P14358题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minfpd17
此快照首次捕获于
2025/12/02 01:39
3 个月前
此快照最后确认于
2025/12/02 01:39
3 个月前
查看原文
这道题可以用二维坐标做,比往年第二题简单。

思路/代码

我的思路就是先输入,然后排序,接下来使用递归函数,最后构造函数。

主函数

n,mn,m 依照题意,首先输入 n,mn,m ,接下来先输入 a1a_1 再把 a1a_1 存在 ww ,然后循环输入,注意要从第2个开始,最后排序、进入函数。
CPP
int main(){
    cin>>n>>m;
    cin>>a[1];
    w=a[1];
    for(int i=2;i<=n*m;i++){
        cin>>a[i];
    }
    sort(a+1,a+n*m+1,cmp);
    dfs(1,1,1);
    return 0;
}

cmp排序函数

正常方式,bool类型。
CPP
bool cmp(int a,int b){
    return a>b;
}

boos dfs(取名而已请不要弄混)

使用这个函数计算答案。

定义函数

xx 是列数, yy 是行数, uu 是标记到了第几个成绩。
CPP
void dfs(int x,int y,int u){

}

首先判断是否到达终点

aua_u 是一定到达的第几个成绩,如果和小R的成绩相符那么就是到达了重点,输出坐标,结束函数。
CPP
    if(a[u]==w){
        cout<<x<<" "<<y;
        return ;
    }

如果是向下的情况

adad 如果是0,那么就代表向下,接下来是第一个判断,如果 yy 再加一位已经离开考场,那么 yy 不变 x+1x+1 。 最后就是正常情况,直接往下来。
CPP
    if(ad==0){
        if(y+1>n){
            ad=1;
            dfs(x+1,y,u+1);
        }
        else{
            dfs(x,y+1,u+1);
        }
    }

如果是向上的情况

adad 如果是1,那么就代表向上,接下来是第一个判断,如果 yy 再减一位已经离开考场,那么 yy 不变 x+1x+1 。 最后就是正常情况,直接往上去。
CPP
    else if(ad==1){
        if(y-1==0){
            ad=0;
            dfs(x+1,y,u+1);
        }
        else{
            dfs(x,y-1,u+1);
        }
    }

函数总体代码

CPP
void dfs(int x,int y,int u){
    if(a[u]==w){
        cout<<x<<" "<<y;
        return ;
    }
    if(ad==0){
        if(y+1>n){
            ad=1;
            dfs(x+1,y,u+1);
        }
        else{
            dfs(x,y+1,u+1);
        }
    }
    else if(ad==1){
        if(y-1==0){
            ad=0;
            dfs(x+1,y,u+1);
        }
        else{
            dfs(x,y-1,u+1);
        }
    }
}

摆上总体代码(精讲)

CPP
#include<bits/stdc++.h>
using namespace std;
int n,m,a[105],w;//定义n是行数,m是列数,a数组是每个人的成绩,w是记录小R的成绩。
bool ad;//记录方向0代表向下,1代表向上。
bool cmp(int a,int b){//排序函数
    return a>b;//从大到小
}
void dfs(int x,int y,int u){//计算函数,x是列,y是行,u是到的第几个成绩。
    if(a[u]==w){//如果答案正确
        cout<<x<<" "<<y;//输出坐标
        return ;//结束
    }
    if(ad==0){//如果向下
        if(y+1>n){//如果到达底部
            ad=1;//改为向上
            dfs(x+1,y,u+1);//移动到下一列
        }
        else{//正常情况
            dfs(x,y+1,u+1);//移动当下一行
        }
    }
    else if(ad==1){//如果向上
        if(y-1==0){//改为到达顶部
            ad=0;//改为向下
            dfs(x+1,y,u+1);//移动到下一列
        }
        else{//正常情况
            dfs(x,y-1,u+1);//移动到上一行
        }
    }
}
int main(){
    cin>>n>>m;//输入矩阵范围
    cin>>a[1];//输入第一个
    w=a[1];//把a[1]存在w里
    for(int i=2;i<=n*m;i++){//从2开始到n*m
        cin>>a[i];//输入接下来的成绩
    }
    sort(a+1,a+n*m+1,cmp);//从大到小排序
    dfs(1,1,1);//进入函数
    return 0;//结束程序
}

总结

水体希望今年大家成绩满意!

结束

请大家不要抄袭题解,遵守道德,大家要一起努力!

评论

0 条评论,欢迎与作者交流。

正在加载评论...