问题描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转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
这道题很简单,就是外加一个标记数组来表示这个位置还有没有元素可以用,这句话就是这个题的灵魂!(外加一个标记数组)只要加了一个标记数组,这道题就迎刃而解。
直接粘代码了。
#include<iostream>
using namespace std;
#define N 200 //不带引号,别忘了
int arr[N][N];
int temp[N][N] = { 0 };//把所有位置经行初始化
int main()
{
int n, m; //行,列
cin >> n;
cin >> m;
int i, j;
for (i = 1; i <= n; i++)
{
for (j = 1; j <= m; j++)
{
cin >> arr[i][j]; //初始化
temp[i][j] = 1;//标记数组中把有数字的元素都标记出来
}
}
cout << arr[1][1]; //输出一个元素
temp[1][1] = 0; //标记数组中元素清零
int sum = 1;
i = 2; j = 1;
while (m * n > sum) //m*n要大于总数
{ //从上到下排列
while (i <= m && temp[i][j] == 1)
{
while (m * n > sum)
{
while (i <= m && temp[i][j] == 1)//1.上往下
{
cout << " " << arr[i][j];
temp[i][j] = 0; //已经输出过的标记为0
i++; sum++;
}
i--; j++; //最后一次循环i已经越界,同时把j加一跳到下一列
while (j <= n && temp[i][j] == 1)//2.左往右
{
cout << " " << arr[i][j];
temp[i][j] = 0;
j++; sum++;
}
i--; j--;
while (i >= 1 && temp[i][j] == 1)//3.下往上
{
cout << " " << arr[i][j];
temp[i][j] = 0;
i--; sum++;
}
i++; j--;
while (j >= 1 && temp[i][j] == 1)//右往左
{
cout << " " << arr[i][j];
temp[i][j] = 0;
j--; sum++;
}
j++; i++;
}
}
}
return 0;
}