zst0915 @ 2024-03-06 22:35:53
#include<bits/stdc++.h>
using namespace std;
int main ()
{
int n,m=0,o=0,p=0;scanf("%d",&n);int arr[n];
for (int i=1;o<n*n;i++)
{
cin>>arr[i];
o+=arr[i];
p++;
}
for (int i=1;i<=p;i++)
{
for(int j=1;j<=arr[i];j++)
{
if(i%2==0){printf ("1");}
else{printf ("0");}
m++;
if(m%n==0)
{printf ("\n");}
}
}
return 0;
}
by Papy @ 2024-03-06 22:57:35
@zst0915
Hi~ 又见面了哈哈哈
看看开的数组,是arr[n], 但是你看看样例就知道大小不一定是n了。假设最坏情况是一个1一个0出现的,那么最多会有n*n个数出现,这样就会内存溢出。
建议至少开nxn+1,因为nxn开的是0到n*n-1的下标。因为你的代码是从1开始存的,有可能存到你nxn也会内存溢出。
我顺便改了一下码风,你看看你喜欢哪种~```cpp
using namespace std; int main(){ int n, m=0, o=0, p=0; scanf("%d", &n); int arr[n*n+1];
for (int i = 1; o < n*n; i++){
cin>>arr[i];
o += arr[i];
p++;
}
for (int i = 1; i <= p; i++){
for(int j = 1; j <= arr[i]; j++){
if (i % 2 == 0)
printf("1");
else
printf("0");
m++;
if (m % n == 0)
printf("\n");
}
}
return 0;
}
这样*应该*就可以了吧qwq
by Papy @ 2024-03-06 22:58:19
@zst0915 发现一不小心格式弄错了qwq
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
int n, m=0, o=0, p=0;
scanf("%d", &n);
int arr[n*n+1];
for (int i = 1; o < n*n; i++){
cin>>arr[i];
o += arr[i];
p++;
}
for (int i = 1; i <= p; i++){
for(int j = 1; j <= arr[i]; j++){
if (i % 2 == 0)
printf("1");
else
printf("0");
m++;
if (m % n == 0)
printf("\n");
}
}
return 0;
}
by Papy @ 2024-03-06 23:12:46
这是我刚写的代码 你可以看看我的思路:
注释版:
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 2e2+5;
int n, a[maxn*maxn];
int main(){
scanf("%d", &n);
int len = 0;
//输入直到为0为止
while (cin>>a[++len])
continue;
//因为最后一位为0,所以len要-1
len--;
//now为当前算到压缩码的第now位
int now = 1;
for (int i = 1; i <= n*n; i++){
//如果a[now]为0, now++, 开始解压下一位压缩码
if (a[now] == 0)
now++;
a[now]--;
// &1效果与%2相等,可以了解一下位运算
if (now & 1)
printf("0");
else
printf("1");
//换行判断
if (i % n == 0)
printf("\n");
}
return 0;
}
无注释版:
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 2e2+5;
int n, a[maxn*maxn];
int main(){
scanf("%d", &n);
int len = 0;
//输入直到为0为止
while (cin>>a[++len])
continue;
//因为最后一位为0,所以len要-1
len--;
//now为当前算到压缩码的第now位
int now = 1;
for (int i = 1; i <= n*n; i++){
//如果a[now]为0, now++, 开始解压下一位压缩码
if (a[now] == 0)
now++;
a[now]--;
// &1效果与%2相等,可以了解一下位运算
if (now & 1)
printf("0");
else
printf("1");
//换行判断
if (i % n == 0)
printf("\n");
}
return 0;
}
几年前我写的版本(我已经看不懂了,但它AC了我也说不了什么qwq):
#include <iostream>
using namespace std;
int n,cnt,timer = 0,flag = 0;
int main(){
cin>>n>>cnt;
while(cnt+1){
if (cnt > 0){
timer++;
cnt--;
cout<<flag;
if (timer % n == 0) cout<<endl;
if (timer >= n * n) cnt--;
}else flag = !flag, cin>>cnt;
}
return 0;
}
几年前我的码风还是很诡异的,没必要看懂qwq
希望能够帮到你~ -v-
by Papy @ 2024-03-06 23:14:01
@zst0915 无注释版复制错了呜呜呜又得发一个贴qwq
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 2e2+5;
int n, a[maxn*maxn];
int main(){
scanf("%d", &n);
int len = 0;
while (cin>>a[++len])
continue;
len--;
int now = 1;
for (int i = 1; i <= n*n; i++){
if (a[now] == 0)
now++;
a[now]--;
if (now & 1)
printf("0");
else
printf("1");
if (i % n == 0)
printf("\n");
}
return 0;
}
by zst0915 @ 2024-03-07 20:59:46
@Papy 我把数组开大了,ac了谢谢大佬!!!
by Papy @ 2024-03-07 21:21:36
@zst0915 没事没事!加油~ (-v-)=b
by zst0915 @ 2024-03-07 21:22:43
@Papy 都看懂了!谢谢你!!! 几年前写的真简洁!好厉害!
by Papy @ 2024-03-07 21:28:25
@zst0915 没有没有 几年前我真的很菜qwq
你肯定能比我厉害的,加油哦! (^-^)=b
by zst0915 @ 2024-03-08 22:56:40
@Papy 谢谢你的鼓励哈哈,我是个小白,我断断续续才学半年!一起加油!祝你也能ac更多题,成为更厉害的人!
by Papy @ 2024-03-08 23:03:44
@zst0915 谢谢!以后有问题可以随时私信我哦-