题目难度不大,只是提醒自己数组的初始化方式,尽量标准一点,否则,不同编译器之间,这种错误很难发现。
- 在函数外部定义的内置类型的数组,最常用的int被默认地初始化为0;
- 在函数内部定义的内置类型数组,默认初始值是未指定的;
- int 类型数组列表初始化时,提供的初始值数量小于数组维度时,剩下的元素被初始化为默认值0;
自已在函数 外部int a[20][6]={0};自己测试没错,提交之后总是0分。最后发现就是这种初始化方式的问题。
引用C++primer的话就是。
默认初始化:
如果定义变量时没有指定初始值,变量被默认初始化,并被赋予默认值。
默认值由变量类型决定,同时,变量的位置也会对默认值有影响。
对于数组的列表初始化,书中写的好像有些模糊和vector联系到了一起。
#include<iostream>
#include<queue>
using namespace std;
int findN(int(*a)[6],int nums) {//查找是否有可以提供连座的行;
for (int i = 0; i < 20; ++i) {
if (a[i][0] >= nums) {
return i;
}
}
return -1;
}
void getAns(int(*a)[6],int nums,queue<int>&q) {
int x = findN(a,nums);
if (x == -1) {//如果不存在,就进行
int hadfind = 0;
for (int ii = 0; ii < 20; ++ii) {
int jj = 1;
for (; jj < 6; ++jj) {
if (a[ii][jj] == 0) {
a[ii][jj] = 1;
q.push(ii*5+jj);
++hadfind;
}
if (hadfind == nums) {
a[ii][0] = 5 - jj;
return;
}
}
a[ii][0] = 0;
}
}
else {
int k = 1;
while (a[x][k] ==1) {
++k;
}
int endi = k+nums;
for (; k < endi;++k ) {
q.push(x*5+k);
a[x][k] = 1;
}
a[x][0] -= nums;
}
}
void input() {
queue<int> q[100];
int a[20][6] = {0};//a[i][0]显示当前行可用座位树;a[i][1]->a[i][5]表示对应座位;
int n;
cin >> n;
for (int i = 0; i < 20; ++i) {
a[i][0] = 5;
}
int x = 0;
for (int i = 0; i <n; ++i) {
cin >> x;
getAns(a,x,q[i]);
}
for (int i = 0; i < n; ++i) {//输出结果;
while (!q[i].empty()) {
cout << q[i].front() << " ";
q[i].pop();
}
cout << endl;
}
}