NOIP中题目的变量定义、数组大小定义、输入输出写法也是很讲究的,新手在学习时还是要多练习,慢慢形成自己的函数库,先学习别人怎么写,慢慢积累,变成自己的函数库。
2022年种花的题目输入的要求如下:
输入格式 第一行包含两个整数 T,id,分别表示数据组数和测试点编号。如果数据为样例则保证 id=0。 接下来一共 T 组数据,在每组数据中: 第一行包含四个整数 n,m,c,f,其中 n,m 分别表示花园的行数、列数,对于c,f 的含义见输出格式部分。 接下来n 行,每行包含一个长度为 m 且仅包含 0 和 1 的字符串,其中第 i 个串的第 j 个字符表示 ai,j, 即花园里的第 i 行第 j 列是不是一个土坑。 输入样例: 1 0 4 3 1 1 001 010 000 000 输出 4 2
这里面的二维数组的输入方式就跟平时练习不太一样,是一行一行输入的。
就是一个嵌套循环,加字符转整型,代码如下:
#include <bits/stdc++.h> #define ll long long using namespace std; const int p=998244353; int T,id,n,m,c,f; ll a[1005][1005]; char s[1005]; int main(){ scanf("%d%d",&T,&id); while(T--){ scanf("%d%d%d%d",&n,&m,&c,&f); for(int i=1;i<=n;i++){ scanf("%s",s);//这里换成gets(s)为什么不行呢? for(int j=0;j<m;j++){ a[i][j+1]=s[j]-'0'; } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ printf("%lld",a[i][j]); } printf("\n"); } } }
题解中看到一位大神用scanf加上参数%1lld,表示每次读取1位整数,搜索了一下用法,果然好用
char str[21]; scanf_s("%20s", str, 21);
上面示例中,宽度规范为 20,这表示从输入流中最多可读取 20 个字符。 缓冲区长度为 21,其中包括用于可能 20 个字符以及 null 终止符的空间;
如果未使用 width 字段,则 scanf_s 会尝试将整个标记读取到字符串中。 如果指定的大小不足以容纳整个标记,则不会向目标字符串写入任何内容。 如果指定了 width 字段,则将标记中的第一个 width 字符与 null 终止符一起写入目标字符串。
#include <bits/stdc++.h> #define ll long long using namespace std; const int p=998244353; int T,id,n,m,c,f; ll a[1005][1005]; char s[1005]; inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-')f=-1; ch=getchar(); } while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar(); return x*f; } int main() { T=read(),id=read(); while(T--){ n=read(),m=read(),c=read(),f=read(); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ scanf("%1lld",&a[i][j]);//这里每次读取1位,字符会自动转换成lld整型存入数组a } } printf("your input:\n"); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ printf("%lld",a[i][j]); } printf("\n"); } } }
有话要说...