天梯赛——福到了(字符串输入)

“福”字倒着贴,寓意“福到”。不论到底算不算民俗,本题且请你编写程序,把各种汉字倒过来输出。这里要处理的每个汉字是由一个 N × N 的网格组成的,网格中的元素或者为字符 @ 或者为空格。而倒过来的汉字所用的字符由裁判指定。

输入格式:

输入在第一行中给出倒过来的汉字所用的字符、以及网格的规模 N (不超过100的正整数),其间以 1 个空格分隔;随后 N 行,每行给出 N 个字符,或者为 @ 或者为空格。

输出格式:

输出倒置的网格,如样例所示。但是,如果这个字正过来倒过去是一样的,就先输出bu yong dao le,然后再用输入指定的字符将其输出。

输入样例 1:

$ 9
 @  @@@@@
@@@  @@@ 
 @   @ @ 
@@@  @@@ 
@@@ @@@@@
@@@ @ @ @
@@@ @@@@@
 @  @ @ @
 @  @@@@@

输出样例 1:

$$$$$  $ 
$ $ $  $ 
$$$$$ $$$
$ $ $ $$$
$$$$$ $$$
 $$$  $$$
 $ $   $ 
 $$$  $$$
$$$$$  $ 

输入样例 2:

& 3
@@@
 @ 
@@@

输出样例 2:

bu yong dao le
&&&
 & 
&&&
#include <bits/stdc++.h>
using namespace std;

int main()
{
    char c,s;
    int Map[105][105];
    memset(Map,0,sizeof Map);
    int n;
    scanf("%c %d",&c,&n);
    for(int i = 1; i <= n; i++)
    {
        getchar(); //获取最后的换行
        for(int j = 1; j <= n; j++)
        {
            scanf("%c",&s); //单个字符逐渐输入
            if(s == '@')
                Map[i][j] = 1;
        }
    }
    bool judge = 1;
    int cnt = 0;
    for(int i = 1; i <= n/2+1; i++)
    {
        for(int j = 1; j <= n; j++)
        {
            cnt++;
            if(cnt > (n*n)/2)
                break;
            if(Map[i][j] != Map[n+1-i][n+1-j])
            {
                judge = 0;
                Map[i][j] = (Map[i][j]+1)%2;
                Map[n+1-i][n+1-j] = (Map[n+1-i][n+1-j]+1)%2;
            }
        }
    }
    if(judge)
       cout << "bu yong dao le"<<endl;
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= n; j++)
            if(Map[i][j] == 1)
                printf("%c",c);
            else
                cout<<" ";
        cout<<endl;
    }
    return 0;
}

更多的输入方式:

string 类型  直接获取一行

    char c;
    string s[105];
    int n,Map[105][105];
    memset(Map,0,sizeof Map);
    scanf("%c %d",&c,&n);
    getchar(); //获取换行符
    for(int i = 1; i <= n; i++)
    {
        getline(cin,s[i]); //每次获取一行
        for(int j = 0; j < s[i].length(); j++)
            if(s[i][j] == '@')
                Map[i][j+1] = 1;
    }

char 类型数组 直接获取一行

为了避免缓冲区溢出,从终端读取输入时应当用fgets()代替gets()函数。
但是这也将带来一个问题,因为fgets()的调用格式是:

fgets (buf, MAX, fp)
fgets (buf, MAX, stdin)

buf是一个char数组的名称,MAX是字符串的最大长度,fp是FILE指针。
fgets()函数读取到它所遇到的第一个换行符的后面,或者读取比字符串的最大长度少一个的字符,或者读取到文件结尾。

fgets()函数向末尾添加一个空字符以构成一个字符串。如果在达到字符最大数目之前读完一行,它将在字符串的空字符之前添加一个换行符以标识一行结束。

字符串的结尾处可能多出一个换行符,我们需要把它去掉。

char c,s[105];
    int n,Map[105][105];
    memset(Map,0,sizeof Map);
    scanf("%c %d",&c,&n);
    getchar(); //处理掉换行
    for(int i = 1; i <= n; i++)
    {
        fgets(s,105,stdin);
        for(int j = 0; j < strlen(s); j++)
            if(s[j] == '@')
                Map[i][j+1] = 1;
    }

猜你喜欢

转载自blog.csdn.net/Nothing_227/article/details/88372555