15 条题解

  • 13
    @ 2023-5-2 14:41:47

    照常吐槽:看到了刚刚的兄弟提交的题解,点我的想法吗?em,一样一样的。太简单了!

    题解

    模拟一下下:先是四个数:长、宽、字符和模式,我分别用四个变量a b c d存储吧(土不拉几

    1. 分两种情况,一种实心一种空心
    • 实心:循环 a 次,每行输出 b 个字符 c
    • 空心:
    1. 第一行输出 b 个字符 c
    2. 中间 a - 2 行每行输出两个字符 c 夹着的空格(b - 2个空格)汉堡
    3. 最后一行同样输出 b 个字符 c
    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
        int a, b, d;
        char c;
        cin >> a >> b >> c >> d;
        if (d == 0)
        {
            for (int i = 1; i <= b; i++) cout << c;
            cout << endl;
            for (int i = 1; i <= a - 2; i++)
            {
                cout << c;
                for (int j = 1; j <= b - 2; j++) cout << " ";
                cout << c << endl;
            }
            for (int i = 1; i <= b; i++) cout << c;
        }
        else
        {
            for (int i = 1; i <= a; i++)
            {
                for (int i = 1; i <= b; i++)
                    cout << c;
                cout << endl;
            }
        }
        return 0;
    }
    
    • @ 2023-8-29 16:58:47

      哥,我知道你做成这样很牛,很不错了,但有一个缺点——循环变量i的名字重复了,这样会导致程序错乱(for循环执行次数出错)

    • @ 2023-8-29 17:03:36

      @对了,你起码有一个j,不是i

    • @ 2023-8-29 17:04:40

      @对不起我说错了,试过是AC

    • @ 2023-8-29 17:34:42

      @我知道我也发了本题题解,但我发誓没有抄这位和其他人的题解,我说试过是AC只是试一下,不要在意啊

    • @ 2023-9-30 9:24:42

      @

      根据变量作用域,只要你在内层循环中不使用外层循环的变量就不会出错,就算出错也只是答案出错不会RE什么的

  • 8
    @ 2023-5-1 20:50:39

    题前吐槽

    照例第一题来吐槽一下。 咳咳……我第一眼看到觉得这啥题难度评分 1010,才俩过的,太拉了……

    直到,我被输入坑了……(我习惯用 scanfscanf 所以被坑了,cincin 应该没事)

    [WTD at 2023.5] 完稿

    [UPD at 2023.10.14] 修改了错误的 LaTeXLaTeX

    题解

    简单的模拟(还能不模拟吗),本来就是一个照给的方式输出的事,但还是简单阐述一下。

    首先输入是四个数“n、宽m、字符c、模式mode长n、宽m、字符c、模式mode”,就是简单的:

    int n, m;
    char c;
    bool mode; // 用bool存了,省3Bit空间……
    
    // scanf输入
    scanf("%d%d%c%d", &n, &m, &c, &mode); //但还是用“%d”输入
    // 或者cin输入(没有坑人问题)
    cin >> n >> m >> c >> mode;
    

    然后有两种实现方法,由于都不复杂,就不分成两个思路说了。

    首先第一种,简单直白,根据 modemode 分类讨论:

    // 也不复杂直接贴代码
    if (mode) //实心
    {
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= m; j++)
            {
                printf("%c", c); // 统统输出c
            }
            printf("\n"); // 记得换行
        }
    }
    else // 空心
    {
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= m; j++)
            {
                if (/* 某条件 */) printf("%c", c); // 作为边框
                else printf(" "); // 空心
            }
            printf("\n");
        }
    }
    

    另一种就是都用一个 forfor 循环,判断 modemode 再决定:

    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            if (mode) printf("%c", c);
            else
            {
                if (/* 某条件 */) printf("%c", c);
                else printf(" ");
            }
        }
        printf("\n");
    }
    

    都差不多,这题唯一难点在于“某条件”,实际上就是根据 iijj 判断是否属于边框部分。

    这里用样例举个例:

    @@@@@@@    <-----边框 (i == 1)
    @     @
    @     @
    @     @
    @     @
    @     @
    @@@@@@@    <-----边框 (i == n)
    ^     ^
    |     |
    边框  边框 (j == m)
    (j == 1)
    

    整理:

    (i == 1) || (i == n) || (j == 1) || (j == m)
    

    本题真实难度:2

    最后一个坑点:如果使用 scanfscanf 要注意 scanfscanf 输入 %c 时不忽略空格,随便一个字符就读入,如果像上面演示程序那样写 scanfscanf,会得到 0pts0pts,应当在 %c 前添加一个空格 ,来忽略输入格式中的空格。(用 cincin 的请忽略)这可能就是难度为2的来源。

    ACAC CodeCode 11

    #include <bits/stdc++.h>
    using namespace std;
    int n, m;
    char c;
    bool mode;
    int main()
    {
        scanf("%d%d %c%d", &n, &m, &c, &mode);
        if (mode)
        {
            for (int i = 1; i <= n; i++)
            {
                for (int j = 1; j <= m; j++)
                {
                    printf("%c", c);
                }
                printf("\n");
            }
        }
        else
        {
            for (int i = 1; i <= n; i++)
            {
                for (int j = 1; j <= m; j++)
                {
                    if (i == 1 || i == n || j == 1 || j == m) printf("%c", c);
                    else printf(" ");
                }
                printf("\n");
            }
        }
        return 0;
    }
    

    ACAC CodeCode 22

    #include <bits/stdc++.h>
    using namespace std;
    int n, m;
    char c;
    bool mode;
    int main()
    {
        scanf("%d%d %c%d", &n, &m, &c, &mode);
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= m; j++)
            {
                if (mode) printf("%c", c);
                else
                {
                    if (i == 1 || i == n || j == 1 || j == m) printf("%c", c);
                    else printf(" ");
                }
            }
            printf("\n");
        }
        return 0;
    }
    
  • 6
    @ 2023-8-15 20:06:13

    画矩形考察的是嵌套循环知识点,同时考察了分之语句,必须在逻辑上清晰步骤和方法,还有一种思路是先判断是否是实心,是的话全部输出符号,不是的话输出边框和内部空格。

    • 2
      @ 2023-8-29 18:18:18

      //这道题其实不算太难,学过Level 2并且预习过Level 4的char命令的童鞋(讲个谐音)们应该都会,请看题解~

      #include <iostream>//头文件在手,天下我独有!
      using namespace std;
      int main()
      {
      int g, k, x;
      char f;//f是字符,要用char命令啦,否则直接打出来就是个数字
      cin >> g >> k >> f >> x;
      if(x == 1)
      {
      for (int i = 1; i <= k * g; i++)
      {
      cout << f;
      if (i % k == 0)
      {
      cout << endl;//f的个数(空心就不一定咯)i到宽,行就必须给俺换
      }//i到宽的倍数也得换,表示(i/ k)条宽【请叫我押韵大王】
      }//i到了一条宽该到的长度(k),此时不换行,更待何时?
      }
      else
      {
      for (int i = 1; i <= k; i++)
      {
      cout << f;//先打第一行
      }
      cout << endl;//然后再换行
      for (int j = 1; j <= g - 2; j++)//接着打中间
      {
      cout << f;//打一行的两头
      for (int l = 1; l <= k - 2; l++)
      {//(k - 2)表示一行的长度减去两头
      cout << " ";//打一行中间的空格
      }
      cout << f << endl;//打一行的两头
      }
      for (int m = 1; m <= k; m++)
      {
      cout << f;//最后打最后一行
      }
      }
      return 0;//写上return 0,天下我问鼎!
      }
      

      先别走~

      最后,希望大家给个大大的赞,谢谢!

      image

      • @ 2023-8-29 18:22:03

        本人刚刚学到Level 2, 但预习了Level 3和Level 4的内容,尽管如此也还只是个C++小萌新,代码如有可改进之处,请大家指教,谢谢!(其实我已经试过了,是AC,请大家放心食用~)

    • 2
      @ 2023-7-16 17:30:04

      (崩溃!!!)写了一大半的题解,中途退出去复制个代码,结果回来全没了TvT。这已经是第五遍从头开始了……


      按我们数学老师的话来说:这道题我这么讲谁都能听懂。我们先来看题:

      题目描述

      根据参数,画出矩形。输入四个参数:前两个参数为整数,依次代表矩形的高和宽(高不少于3行不多于10行,宽不少于5列不多于10列);第三个参数是一个字符,表示用来画图的矩形符号;第四个参数为1或0,0代表空心,1代表实心。

      输入

      输入一行,包括四个参数:前两个参数为整数,依次代表矩形的高和宽(高不少于3行不多于10行,宽不少于5列不多于10列);第三个参数是一个字符,表示用来画图的矩形符号;第四个参数为1或0,0代表空心,1代表实心。

      输出

      输出画出的图形。

      样例

      输入数据 1

      7 7 @ 0
      

      输出数据 1

      @@@@@@@
      @     @
      @     @
      @     @
      @     @
      @     @
      @@@@@@@
      

      题目分析

      简单来说,这道题就是给你四个参数,让你用程序按照规定画出一个矩形。 第一个和第二个参数分别为矩形的宽(s竖着的)和长(横着的),我们用int变量来定义为a和b; 第三个参数是一个字符类型的变量,也是构成矩形的基本元素,直白点说,就是告诉你该用粗笔还是细笔画边框,该用什么颜色填充。我们用char类型变量把它定义为c; 第四个参数在我们画矩形时是要考虑的重要因素——实心和空心,按照画画的角度来说,就是涂色和画边框,按我们编程的角度来说,就是输不输出空格。我们也用int类型来定义它,取名为d。

      大体思路

      首先,我们要确定输出的载体。输出的是一个矩阵,我们首先想到的就是循环嵌套了(L5知识点),外层循环控制行数(变量a), 内层循环控制列数(变量b)。代码如下:

      for(int i=1;i<=a;i++)
      {
          for(int j=1;j<=b;j++)
          {
              cout<<c;
          }
          cout<<endl;
      }
      

      先别急,这只是最基础的框架,中间需要添加的部分且听我慢慢道来……接下来,咱们研究空心实心的问题。 实心就灰常简单了,上面的代码就是,不过要加一个if来判断(还有空心呢)。 空心呢,相对来说麻烦一些。样例中,第一行和最后一行(外层循环i等于1或i等于a)是不用空格的,直接输出即可。代码如下:

      if(i==1||i==a)
      {
          for(int j=1;j<=b;j++)
          {
              cout<<c;
          }
      }
      

      第二行到倒数第二行是需要空格的部分。每行的第一个字符和最后一个字符,就是第一列和最后一列的字符(内层循环j等于1或j等于b)不是空格,其他列则为空格。代码如下:

      for(int j=1;j<=b;j++)
      {
          if(j==1||j==b)
          {
              cout<<c;
          }
          else
          {
              cout<<" ";
          }
      }
      

      本题的思路大致如此,本人刚刚学到L8,如有不足请各位大佬们指导,本人将尽力改正,谢谢大家的批评和支持❤️

      完整代码

      完整代码如下:

      #include <bits/stdc++.h>//万能头文件在手,天下我有
      using namespace std;//std命名空间
      int a,b,d;//参数1,2,4定义
      char c;//
      int main()//
      {
          cin>>a>>b>>c>>d;//输入各参数
          for(int i=1;i<=a;i++)//外层循环 控制行数
          {
              if(d==0)//空心
              {
                  if(i==1||i==a)//第一行或最后一行
                  {
                      for(int j=1;j<=b;j++)//内层循环 控制列数
                      {
                          cout<<c;//输出字符
                      }
                  }
                  else//其他行
                  {
                      for(int j=1;j<=b;j++)
                      {
                          if(j==1||j==b)//第一列或最后一列
                          {
                              cout<<c;//输出字符
                          }
                          else//其他列
                          {
                              cout<<" ";//输出空格
                          }
                      }
                  }
              }
              else//实心
              {
                  for(int j=1;j<=b;j++)
                  {
                      cout<<c;
                  }
              }
              cout<<endl;//外层循环结尾输出换行
          }
          return 0;//返回数值0,程序运行结束
      }
      
      • 1
        @ 2023-10-5 11:09:05

        楼上诸位大佬已经分析的差不多了,我也发个题解凑凑热闹吧

        AC代码:

        #include<bits/stdc++.h> //万能头文件,启动!
        using namespace std;
        int a,b,n;
        char x;
        int main()
        {
            cin >> a >> b >> x >> n;
            if(n == 1) //实心
            {
                for(int i = 1;i<=a;i++)
                {
                    for(int j = 1;j<=b;j++)
                    {
                        cout << x;
                    }
                    cout << endl;//记得换行,记得换行,记得换行!
                }
            }
            else if(n == 0) //空心(其实else也可以)
            {
                for(int i = 1;i<=a;i++)
                {
                    for(int j = 1;j<=b;j++)
                    {
                        if(i == 1||i == a||j == 1||j == b)//条件判断
                        {
                            cout << x;
                        }
                        else
                        {
                            cout << " ";
                        }
                    }
                    cout << endl;
                }
            }
            return 0;
        }
        
        • 1
          @ 2023-7-20 22:21:17

          啊…… 各位大佬的题解都很厉害啊,那小爷,呸,我来谈谈我的想法,我是理科生,所以没有面面俱到,就简单写点注释,大家能看懂就看,看不懂呢可以看几位大佬的真知灼见。 仅表个人观点,不喜勿喷

          
          

          #include <iostream> using namespace std; int main() { int a,b; char ch; bool x; int i,j;

          cin>>a>>b;//行、列
          cin>>ch;//填充符号
          cin>>x;//空心或实心
          
          if(x)//实心
          {
              for(i=1; i<=a; i++)
              {
                  for(j=1; j<=b; j++)   cout<<ch;
                  cout<<endl;
              }
          }
          else//空心
          {
              for(i=1; i<=a; i++)
              {
                  for(j=1; j<=b; j++)
                  {
                      if((i==1)||(i==a)||(j==1)||(j==b))//四条边均按条件输出
                          cout<<ch;
                      else
                          cout<<" ";
                  }
                  cout<<endl;
              }
          }
          cout<<endl;
          return 0;
          

          }

          • @ 2023-10-14 20:18:44

            《真知灼见》,文科生吧

        • 0
          @ 2024-4-20 20:48:14
          #include<bits/stdc++.h>
          using namespace std;
          int main(){
              int x,y;
              char n;
              bool m;
              cin>>x>>y>>n>>m;
              for(int i=1;i<=x;i++){
                  cout<<n;
                  for(int j=2;j<y;j++){
                      if((m==1)||(i==1)||(i==x)){
                          cout<<n;
                      }
                      else{
                          cout<<" ";
                      }
                  }
                  cout<<n<<endl;
              }
              return 0;
          }
          
          • 0
            @ 2024-4-8 18:13:29

            思路几乎相同

            #include <iostream>
            using namespace std;
            int main()
            {
                int a,b,d;
                char c;
                cin >> a >> b >> c >> d;
                if (d==0)
                {
                    for (int i=1;i<=b;i++)
                    {
                        cout << c;
                    }
                    cout << endl;
                    for (int i=1;i<=a-2;i++)
                    {
                        cout << c;
                        for (int j=1;j<=b-2;j++)
                        {
                            cout << " ";
                        }
                        cout << c << endl;
                    }
                    for (int i=1;i<=b;i++)
                    {
                        cout << c;
                    }
                }
                else
                {
                    for (int i=1;i<=a;i++)
                    {
                        for (int j=1;j<=b;j++)
                        {
                            cout << c;
                        }
                        cout << endl;
                    }
                }
                return 0;
            }
            
            • 0
              @ 2024-1-30 21:48:26
              #include <iostream>
              using namespace std;
              int main()
              {
                  int n,m,y;
                  char x;
                  cin>>n>>m>>x>>y;
                  if (y==0)
                  {
                      for (int i=1;i<=n;i++)
                      {
                          for (int j=1;j<=m;j++)
                          {
                              if (i==1||i==n||j==1||j==m)
                              {
                                  cout<<x;
                              }
                              else{
                                  cout<<" ";
                              }
                          }
                          cout<<endl;
                      }
                  }
                  else
                  {
                      for (int i=1;i<=n;i++)
                      {
                          for (int j=1;j<=m;j++)
                          {
                              cout<<x;
                          }
                          cout<<endl;
                      }
                  }
                  return 0;
              }
              
              • 0
                @ 2023-11-15 19:31:43
                #include <bits/stdc++.h> 
                using namespace std;
                int n,a[50001],m;
                bool flag;
                char q;
                int main(){
                    cin>>n>>m>>q>>flag;
                    if(flag){
                        for(int i=1;i<=n;i++){
                            for(int j=1;j<=m;j++){
                                cout<<q;
                            }
                            cout<<endl;
                        }
                    }
                    else{
                        for(int i=1;i<=n;i++){
                            for(int j=1;j<=m;j++){
                                if(i==1||i==n||j==1||j==m){
                                    cout<<q;
                                }
                                else{
                                    cout<<' ';
                                }
                            }
                            cout<<endl;
                        }
                    }
                    return 0;
                }
                

                easy

                • 0
                  @ 2023-11-5 20:00:11

                  这个方法是一种基础的方法,好理解,编写简单,好记.(头文件和结尾需要自己加)

                      int a, b, d;//a是高,b是宽,d是0或1
                      char c;//图案
                      cin >> a >> b >> c >> d;
                      for (int i = 1; i <= a; i++)//控制行数
                      {
                      	for (int j = 1; j <= b; j++)//控制列数
                      	{
                      		if (d == 1)//实心
                      		{
                      			cout << c;
                  			}
                  			else//空心
                  			{
                  				if (i == 1 || i == a)//第一行和最后一行
                  				{
                  					cout << c;
                  				}
                  				else if (j == 1 || j == b)//第一列和最后一列
                  				{
                  					cout << c;
                  				}
                  				else// 除了上述地方,空心部分要输出空格
                  				{
                  					cout << " ";//中间有空格
                  				}
                  			}
                  		}
                  		cout << endl;//不要忘记换行
                  	}
                  

                  本人Level5,是AC,放心使用

                  • 0
                    @ 2023-9-22 21:15:00
                    可以定义一个 ``mode`` 函数, 就像这样:
                    #include <iostream>
                    using namespace std;
                    
                    void mode (int a,int b,char iotsm,int ardo){
                        for (int i = 0;i < b;i++){
                            cout << iotsm;
                        }
                        cout << endl;
                        for (int i = 0;i < a - 2;i++){
                            cout << iotsm;
                            for (int j = 0;j < b - 2;j++){
                                if (ardo == 1){
                                    cout << iotsm;
                                }
                                else{
                                    cout << " ";
                                }
                            }
                            cout << iotsm;
                            cout << endl;
                        }
                        if (a > 1){
                            for (int i = 0;i < b;i++){
                            cout << iotsm;
                            }
                            cout << endl;
                        }
                        return;
                    }
                    
                    int main(){
                        int w,x;
                        char y;
                        int z;
                        cin >> w >> x >> y >> z;
                        mode(w,x,y,z); 
                        return 0;
                    }
                    

                    本人才level4,自己预习了一下level5的函数。

                    </p>
                    • 0
                      @ 2023-8-31 15:06:01

                      过辣!

                          int a,b,d;
                          char c;
                          cin>>a>>b>>c>>d;
                          if (d)//实心
                          {
                              for (int i=1;i<=a;i++)
                              {
                                  for (int j=1;j<=b;j++)cout<<c;
                                  cout<<endl;
                              }
                          }
                          else//空心
                          {
                              for (int i=1;i<=a;i++)
                              {
                                  cout<<c;
                                  if (i==1 || i==a)for (int j=2;j<b;j++)cout<<c;
                                  else for (int j=2;j<b;j++)cout<<" ";
                                  cout<<c<<endl;
                              }
                          }
                      
                      • -5
                        @ 2023-6-12 12:42:59

                        #include <bits/stdc++.h> using namespace std; int main() { int a,b,h; cout<<bh<<endl; for (int i=1;i<=a-2;i++) {cout<<c<<(b-2)' '<<endl; } cout <<b*h;

                        • @ 2023-8-31 11:34:24

                          这位童鞋的题解做错粒神木,为神木有两个👎?蒜粒(算了),反正已经有两个👎了,不如我再来一个😀

                        • @ 2023-10-3 20:27:53

                          同学,建议你发题解前看一下上面的要求哦 给个好评鼓励一下(虽然你的代码我根本就看不懂)

                      • 1

                      信息

                      ID
                      2059
                      时间
                      1000ms
                      内存
                      128MiB
                      难度
                      5
                      标签
                      (无)
                      递交数
                      830
                      已通过
                      334
                      上传者