PAT B1036 和奥巴马一起学算法,非常非常简单的一道题:用指定的字符打印边长为n的矩形,下面是我看别人写的解答,常规思路就是分第一行和最后一行,以及2~n-1行,不过由于在控制台中的行列比例为了使它显示得更像矩形,只打印n/2行。
常规解答:
1 #include <cstdio> 2 3 int main() { 4 int n; // 边长 5 char c; // 字符 6 scanf("%d %c", &n, &c); 7 8 // 第一行 9 for (int i = 0; i < n; i++) { 10 printf("%c", c); // n个字符 11 } 12 printf(" "); 13 14 // 第2~n/2-1行 15 for (int i = 1; i < n / 2 - 2; i++) { 16 printf("%c", c); // 每行的第一个c 17 for (int j = 0; j < n - 2; j++) { 18 printf(" "); // n-2个空格 19 } 20 printf("%c ", c); 21 } 22 23 // 第n/2行 24 for (int i = 0; i < n; i++) { 25 printf("%c", c); 26 } 27 28 return 0; 29 }
运行效果:
虽然是一道非常简单得题,但是我有另一种普通人“常规”得解决方式:
1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 int n; 7 char c; 8 cin >> n >> c; 9 for (int i = 0; i < n / 2; i++) { 10 for (int j = 0; j < n; j++) { 11 if (i == 0 || i == n / 2 - 1 || j == 0 || j == n - 1) { 12 cout << c; 13 } else { 14 cout << ' '; 15 } 16 } 17 cout << endl; 18 } 19 return 0; 20 }
对比两种方式,第一种是按计算机的处理方式来进行,计算机打印字符的方式:一江春水向东流,飞流直下三千尺。而第二种则是按照普通人画一个矩形的方式去实现:横竖4条边。
虽然解决的是同一个问题,但换一种思维方式却能使代码更加精简,值得深思。