洛谷 P11120 [ROIR 2024 Day 1] 登机 题解

Part 0 前言
这种题一看就是签到题,也是特水,建议评红或橙。

Part 1 
思路就是先将已有位置先填对称,然后将剩余还未添加的乘客以对称方式填入。

首先可以特判掉需要的位置大于空位的情况,直接输出 Impossible

然后用数组记录 .X 的位置,先遍历所有 X 的位置,然后看他的对称位置是否为空,若为空,则填入 X,然后 m--。最后若 m<0m < 0m<0,则说明现有的人不能满足对称(太少了),若 m mod 2=0m \bmod 2 = 0mmod2=0,则说明还未添加的乘客不能以对称方式填入,这两种都应输出 Impossible

最后遍历所有 . 的位置,以对称方式填入即可。

Part 2 AC Code

#include
using namespace std;
char a[1010][10];
struct seat{
    int x;
    int y;
}Map[10100],Mpa[10100];//记录位置
int main()
{
    int n,m,sum1=0,sum2=0,num1=1,num2=1;//记录数量
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=6;j++){
            cin>>a[i][j];
            if(a[i][j]=='X'){
                sum1++;
                Map[num1].x=i;
                Map[num1].y=j;
                num1+=1;
            } 
            else{
                sum2++;
                Mpa[num2].x=i;
                Mpa[num2].y=j;
                num2+=1;
            }
        }
    } 
    if(n*6-sum1<m){
        cout<<"Impossible";
        return 0;
    }//特判
    for(int i=1;i<=sum1;i++){
        if(a[Map[i].x][7-Map[i].y]!='X') m--,a[Map[i].x][7-Map[i].y]='X';//若对称位上没有,则填入
    }
    if(m<0||m%2==1){
        cout<<"Impossible";
        return 0;
    }//判定
    for(int i=1;i<=sum2;i++){
        if(m==0) break;
        if(a[Mpa[i].x][7-Mpa[i].y]!='X') m-=2,a[Mpa[i].x][7-Mpa[i].y]='X',a[Mpa[i].x][Mpa[i].y]='X';;//若对称位上没有,则填入
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=6;j++){
            cout<<a[i][j];
        }
        cout<<endl;
    } 
    return 0;
}
/*完结撒花(*^▽^*)*/

你可能感兴趣的:(洛谷,c++,c语言,算法)