前言
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
提示:以下是本篇文章正文内容,下面案例可供参考
代码如下(示例):
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> v;
int main()
{
int j, x, m, n, a[205][205];
bool vis[205][205];
scanf("%d%d",&m,&n);
for (int p = 0;p < m;p++)
{
for (int q = 0;q < n;q++)
{
scanf("%d",&a[p][q]);
}
}
x=min(n,m);
//圈数
for (int i = 0;i < (x + 1) / 2;i++)
{
//向下
for (j = i;j < m - i;j++)
{
if(!vis[j][i]){
v.push_back(a[j][i]);
vis[j][i]=true;
}
}
//向右
for (j = i + 1;j < n-i;j++)
{
if(!vis[m-i-1][j]){
v.push_back(a[m - i - 1][j]);
vis[m-i-1][j]=true;
}
}
//向上
for (j = m - i - 2;j >= i;j--)
{
if(!vis[j][n-i-1]){
v.push_back(a[j][n - i - 1]);
vis[j][n-i-1]=true;
}
}
//向左
for (j = n - i - 2;j >= i+1;j--)
{
if(!vis[i][j]){
v.push_back(a[i][j]);
vis[i][j]=true;
}
}
}
for(j=0;j<v.size()-1;j++){
printf("%d ",v[j]);
}
printf("%d",v[j]);
return 0;
}
总结
1.本题相当于逆时针去数组里面的数据。
2.第二步先根据给定的行数、列数来确定逆时针转几圈。
3.用圈数来确定数组下标
4.最后一圈可能会出现重复取数现象,所以设定了一个bool数组vis来标记是否走过。