思路拆解:
输入:输入按照for循环输入一个数组
解题:
1、首先考虑遍历过程中可以找到相邻座位的情况,建立bool数组,初始化为false证明100个位子还都没有人选,依次遍历顾客发布的购票指令p,当bool为false时sum++,代表这一个座位可以暂时锁住(还不能变为true呢,因为如果你要遍历这一排五个座位后发现sum的值达不到,就需要去下一排重新找相邻的空位,之前锁的座位就是空位),所以当sum==购票指令要求的张数时,再利用一个小循环锁定之前遍历过sum相加的位子。
2、当把所有售出的位子都置为true后,寻找规律根据每个位子的坐标输出真实座位数字,当座位坐标为i,j时,真实座位数为(j+1)+5*(i),每次为true的时候输出。
3、当遍历所有100个座位后仍找不到可以相邻的座位,那么再次双层循环嵌套进行遍历,当遇到空座位false时,按照第二步所述规律输出真实座位坐标,且购买票数减一,当购买票数减到0的时候表示已达到购票指标(散位子),退出循环。
4、学到了一个goto函数,可以方便跳出任何循环,弥补了我break实在搞不清楚的问题。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,arr[101],sum;
bool b[11][6];
int main(){
cin>>n;
memset(b,false,sizeof(b));//将b全置为false表示还未有任何人买票
for(int i=0;i<n;i++){
cin>>arr[i];//购票指令p表示要买的张数
}
//将已售出的位子置为true
for(int i=0;i<n;i++){
for(int k=0;k<10;k++){
sum=0;
for(int j=0;j<5;j++){
if(b[k][j]==false){
sum++;
}
if(sum==arr[i]){
for(int m=j-arr[i]+1;m<=j;m++){
b[k][m]=true;//位子已被售出
cout<<(m+1)+5*(k)<<" ";//输出座位表
}
cout<<endl;
goto out;//去往标识符
}
}
}
//如果找一遍了还是找不到相领的位子
if(sum<arr[i]){
for(int k1=0;k1<10;k1++){
for(int j1=0;j1<5;j1++){
if(b[k1][j1]==false){
b[k1][j1]=true;
cout<<(j1+1)+5*(k1)<<" ";
arr[i]--;
if(arr[i]==0){
goto out1;
}
}
}
}
out1:;
cout<<endl;
}
out:;
}
}
但是提交代码测评只有40分,先记录下。