用C++实现:回形取数
程序员文章站
2023-02-21 15:00:05
问题描述 回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。 输入格式 输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。 输出格式 输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数 ......
问题描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输入格式
输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。
输出格式
输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。
样例输入
3 3
1 2 3
4 5 6
7 8 9
1 2 3
4 5 6
7 8 9
样例输出
1 4 7 8 9 6 3 2 5
样例输入
3 2
1 2
3 4
5 6
1 2
3 4
5 6
样例输出
1 3 5 6 4 2
思路:根据回型数的规律,每4个动作为一个大循环,也就是先往下走,再往右走,再往上走,最后往左走。所以一个大循环里面套4个小循环就能解决了。
1 #include<iostream> 2 using namespace std; 3 int main(void) 4 { 5 int m, n; 6 int a, b, c, d, i, j, k, t, h, v, l, u; 7 i = 0; 8 k = 0; 9 h = 0; 10 v = 1; 11 l = 0; 12 u = 0; 13 cin >> m >> n; 14 j = m * n; 15 int arr[m][n]; 16 int brr[j]; 17 for (int x = 0; x < m; x++) 18 { 19 for (int y = 0; y < n; y++) 20 { 21 cin >> arr[x][y]; 22 } 23 } 24 for (t = 0; t < j;) //计数,一共有m*n个数,要遍历m*n次 25 { 26 for (a = h; a < m; a++) //先往下走 注意这个a<m m实际上每次都不一样 因为并不是每一次都能走到最下方 27 { 28 brr[t] = arr[a][i]; 29 t++; 30 if (t == j) //注意到达临界点的时候要及时跳出整个循环 31 { 32 break; 33 } 34 } 35 for (b = v; b < n; b++) //再往右走 注意这个b<n n实际上每次都不一样 因为并不是每次都能够走到最右边 36 { 37 brr[t] = arr[m - 1][b]; 38 t++; 39 if (t == j) 40 { 41 break; 42 } 43 } 44 for (c = m - 2; c >= l; c--) //再往上走 不要写成c>=0 并不是每次都自减到第一行 45 { 46 brr[t] = arr[c][n - 1]; 47 t++; 48 if (t == j) 49 { 50 break; 51 } 52 } 53 for (d = n - 2; d > u; d--) //再往左走 不要写成d>0 并不是每次都自减到第一列 54 { 55 brr[t] = arr[k][d]; 56 t++; 57 if (t == j) 58 { 59 break; 60 } 61 } 62 m--; 63 n--; 64 i++; 65 k++; 66 h++; 67 v++; 68 l++; 69 u++; 70 } 71 for (int q = 0; q < j - 1; q++) 72 { 73 cout << brr[q] << " "; 74 } 75 cout << brr[j - 1]; 76 return 0; 77 }
注意:(1)这段代码里面我用了很多变量,一定不要混淆了各个变量之间的关系以及作用
(2)当t=m*n的时候要及时跳出循环,否则就会造成数组越界
(3)注意每一个小循环结束的判断条件,因为没经过一次大循环,判断条件都会发生变化
再来看一个我在网上找到的一个比较简单的代码:
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int m = 0, n = 0; 6 cin >> m >> n; 7 int a[m][n]; 8 for (int i = 0; i < m; i++) 9 for (int j = 0; j < n; j++) 10 cin >> a[i][j]; 11 int circle = 0, count = 0; //初始化循环数,输出计数 12 while (count < m * n) 13 { 14 for (int i = circle; i < m - circle && count < m * n; i++) //第一条边 (左) 15 { 16 cout << a[i][circle] << " "; 17 count += 1; 18 } 19 for (int j = circle + 1; j < n - circle && count < m * n; j++) //第二条边(下) 20 { 21 cout << a[m - 1 - circle][j] << " "; 22 count += 1; 23 } 24 for (int k = m - 2 - circle; k >= circle && count < m * n; k--) //第三条边(右) 25 { 26 cout << a[k][n - 1 - circle] << " "; 27 count += 1; 28 } 29 for (int h = n - 2 - circle; h >= 1 + circle && count < m * n; h--) //第四条边(上) 30 { 31 cout << a[circle][h] << " "; 32 count += 1; 33 } 34 circle += 1; //循环次数加1 35 } 36 return 0; 37 }
原文链接:https://blog.csdn.net/wjinjie/article/details/104954349
上一篇: 意大利菜的特点,有哪些代表的菜肴?