Part 0 前言
这种题一看就是签到题,也是特水,建议评红或橙。
Part 1 思路
思路就是先将已有位置先填对称,然后将剩余还未添加的乘客以对称方式填入。
首先可以特判掉需要的位置大于空位的情况,直接输出 Impossible
。
然后用数组记录 .
和 X
的位置,先遍历所有 X
的位置,然后看他的对称位置是否为空,若为空,则填入 X
,然后 m--
。最后若
m
<
0
m < 0
m<0,则说明现有的人不能满足对称(太少了),若
m
m
o
d
2
=
0
m \bmod 2 = 0
mmod2=0,则说明还未添加的乘客不能以对称方式填入,这两种都应输出 Impossible
。
最后遍历所有 .
的位置,以对称方式填入即可。
Part 2 AC Code
#include<bits/stdc++.h>
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;
}
/*完结撒花(*^▽^*)*/