相信你是最棒哒!!!
文章目录
[一、 输出音符位置](#一、 输出音符位置)
一、 输出音符位置
你正在玩你最喜欢的节奏游戏,osu!mania。你的谱面的布局由 n 行和 4 列组成。由于底部的音符更近,因此你将首先处理最底部的行,最后处理最顶部的行。每一行将恰好包含一个音符,用 '#' 表示。
对于每个音符 1,2,...,𝑛按照处理的顺序,输出音符出现的列号。
输入
第一行包含 𝑡t (1≤𝑡≤100) --- 测试用例的数量。
对于每个测试用例,第一行包含 𝑛n (1≤𝑛≤500) --- 谱面的行数。
接下来的 𝑛n 行包含 4 个字符。第 𝑖i 行表示从顶部开始的第 𝑖 行谱面。可以保证字符要么是 '.' 要么是 '#',并且恰好有一个字符是 '#'。
可以保证所有测试用例中 𝑛 的总和不超过 500。
输出
对于每个测试用例,在新的一行中输出 n 个整数,表示从 1 到 n 的所有 i 中音符 i 出现的列号。
示例
Input | Output |
---|---|
3 4 #... .#.. ..#. ...# 2 .#.. .#.. 1 ...# |
4 3 2 1 2 2 4 |
正确代码
注释版
#include <stdio.h>
char a[511][4];
int main()
{
int n, i,j,k,l,m,t; // 定义整型变量循环和存储数据
scanf("%d", &n); // n表示接下来有多少组数据
for (i = 1; i <= n; i++) // 外层循环,遍历每一组数据
{
scanf("%d", &t); // 读取一个整数t,表示这一组数据中有多少行。
getchar(); // 读取并丢弃一个字符,通常是换行符,以确保后续读取字符串时不会读取到错误的数据
//这一步非常重要 不写就错啦
for (j = 1; j <= t; j++) // 中层循环,遍历每一行
{
for (k = 1; k <= 4; k++) // 内层循环,遍历每个字符
scanf("%c", &a[j][k]); // 读取一个字符,并存储到数组a中。
getchar(); // 读取并丢弃一个字符,通常是换行符。
}
for (l = t; l > 0; l--) // 从最后一行开始向上遍历
{
for (m = 4; m > 0; m--) // 从最后一个字符开始向左遍历
{
if (a[l][m] == '#') // 如果找到`#`字符。
{
printf("%d ", m); // 输出该字符的位置(从1开始计数)。
break; // 找到`#`后跳出内层循环。
}
}
}
printf("\n"); // 每组数据输出完毕后换行。
}
return 0; // 主函数返回0,表示程序正常结束
}
简洁版
#include <stdio.h>
char a[511][4];
int main()
{
int n, i,j,k,l,m,t;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
scanf("%d", &t);
getchar();
for (j = 1; j <= t; j++)
{
for (k = 1; k <= 4; k++)
scanf("%c", &a[j][k]);
getchar();
}
for (l = t; l > 0; l--)
{
for (m = 4; m > 0; m--)
{
if (a[l][m] == '#')
{
printf("%d ", m);
break;
}
}
}
printf("\n");
}
return 0;
}
二、棋盘中的字母
问题描述
在一个8×8点的网格上,一个由小写拉丁字母组成的单词垂直地写在一列中,从上到下。这是什么单词?
输入
输入包含多个测试用例。输入的第一行包含一个整数t(1≤𝑡≤1000)--- 测试用例的数量。
每个测试用例包含8行,每行包含88个字符。网格中的每个字符都是..(表示一个点)或小写拉丁字母(a--z)。
这个单词完全位于一列中,并且从开始到结束连续(没有间隙)。请参考示例输入以获得更好的理解。
输出
对于每个测试用例,输出一行,其中包含由小写拉丁字母组成的单词(a--z),该单词垂直地写在一列中,从上到下。
示例
Input | Output |
---|---|
5 ........ ........ ........ ........ ...i.... ........ ........ ........ ........ .l...... .o...... .s...... .t...... ........ ........ ........ ........ ........ ........ ........ ......t. ......h. ......e. ........ ........ ........ ........ ........ .......g .......a .......m .......e a....... a....... a....... a....... a....... a....... a....... a....... |
i lost the game aaaaaaaa |
正确代码
注释版
#include <stdio.h>
char a[8][9]; // 声明一个8x9的字符数组,用于存储棋盘的布局,每个格子可以存储一个字符和一个换行符
int main()
{
int n, i, j, k, l, m;
scanf("%d", &n); // 棋盘数量
getchar(); // 读取并丢弃换行符,以避免影响后续的输入 这一步也和上一题一样重要呦
for (i = 1; i <= n; i++) // 外层循环,控制读取和打印棋盘的数量
{
for (j = 0; j < 8; j++) // 中层循环,控制棋盘的行
{
for (k = 0; k <= 8; k++) // 内层循环,控制棋盘的列
scanf("%c", &a[j][k]);
}
for (l = 0; l < 8; l++) // 外层循环,控制行
{
for (m = 0; m < 8; m++) // 内层循环,控制列
{
if (a[l][m] != '.' && a[l][m] != '\n') // 如果当前格子不是空格也不是换行符,则打印
printf("%c", a[l][m]); // 打印当前格子的字符
}
}
printf("\n"); // 每打印完一个棋盘后换行
}
return 0; // 程序正常结束
}
简洁版
#include <stdio.h>
char a[8][9];
int main()
{
int n, i,j,k,l,m;
scanf("%d", &n);
getchar();
for (i = 1; i <= n; i++)
{
for (j = 0; j < 8; j++)
{
for (k = 0; k <= 8; k++)
scanf("%c", &a[j][k]);
}
for (l = 0; l < 8; l++)
{
for (m = 0; m < 8; m++)
{
if (a[l][m] != '.' && a[l][m] != '\n')
printf("%c", a[l][m]);
}
}
printf("\n");
}
return 0;
}
总结
输入数字之后要加上一个getchar() 用来吸收换行符,不然换行符会被当做一个字符读入数组中,怎么看都对,但结果是错误的