用C++实现:回形取数

2020-03-25 16:01:31来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

用C++实现:回形取数

问题描述   回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。 输入格式   输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。 输出格式   输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。 样例输入 3 3
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 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


原文链接:https://www.cnblogs.com/guanrongda-KagaSakura/p/12565163.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:CodeForces 1326E - Bombs

下一篇:迷宫算法 之 迷宫生成和迷宫寻路