问题描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转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
简单的模拟题,跟兰顿蚂蚁很像啊
#include<iostream>
#include<string.h>
using namespace std;
int map[200][200];
bool book[200][200]; //false为未访问,true为访问
int main()
{
int d,c,r;
int nc, nr;
int dir[4][2] =
{
1,0, //下
0,1, //右
-1,0, //上
0,-1, //左
};
int m, n;
//#pragma warning( disable : 4996)
//freopen("d://in.txt", "r", stdin);
while (cin >> m >> n)
{
for (int i = 0;i<m;i++)
for (int j = 0;j < n;j++)
cin >> map[i][j];
d = r = 0;
c = 1;
memset(book, false, sizeof(book));
cout << map[0][0];
book[0][0] = true;
if (m == 1)break;
while (!book[c][r])
{
cout <<" "<< map[c][r];
book[c][r] = true; //dir[d%4][0]+c下一行 dir[d % 4][1]+r下一列
nc = dir[d % 4][0] + c;
nr = dir[d % 4][1] + r;
if (nc >= m || nr >= n || book[nc][nr]||nc<0||nr<0) //出界 或者 撞墙
{
d++;
c += dir[d % 4][0];
r += dir[d % 4][1];
}
else
{
c = nc;
r = nr;
}
}
cout <<endl;
}
return 0;
}