您的位置:首页 > 其它

逆时针蛇形排列矩阵

2017-03-15 21:34 197 查看
题目描述

  有一个N*N的矩阵,这个矩阵中的元素是按逆时针方向排列的,例如我们输入一个数4,那么这个矩阵的元素将会是如下形式的:

  1 12 11 10

  2 13 16 9

  3 14 15 8

  4 5 6 7

  现在问题是这样的,给你一个数N,表示这个矩阵的规模,让你按照以上形式输入这个矩阵。每个元素中间有一个空格。

输入

  每行给定整数N (N<100),表示矩阵为 N*N。

输出

  按照描述打印对应的矩阵。

样例输入

  4

样例输出

  1 12 11 10

  2 13 16 9

  3 14 15 8

  4 5 6 7



  此题的思路在于把创建的整个二维数组全都赋值为0,即认为所有为0的位置都是可以赋值的,这是关键,目的是为了判断是否应该转弯。
  基本思路是由题可知,可以认为是在逆时针行走,规定一个行走的顺序为下→右→上→左。如果当前的位置的值是0时,给当前位置赋值并继续按原来的方向行走。如果没有出界就继续按当前的方向行走,如果出界,则回退一步,然后根据逆时针的方向行走。
  刚开始在①和②的最外围行走时,可以通过给定的整数N来判断是否走出界,然后转到③和④时,通过当前位置的坐标的行索引或列索引是否是大于0来判断是否走出界。在走完最外围之后,就可以通过根据当前所在位置的值是否是0来决定是否应该赋值。如果是0,给当前位置赋值并继续按原方向行走,如果不是0,即之前已经赋过值了,则证明已经走出了应该走的范围,这时候回退一格,然后根据逆时针的方向更换方向继续行走,走的总步数为N*N。
  此外,如果要求的是M*N的矩阵,只需要稍许修改一下代码即可。同时如果要求的是顺时针行走,仅需改动while循环中行走的方向即可。

附上代码:

#include <stdio.h>
int main()
{
int n,i,j,count = 1,sum;
scanf("%d",&n);
sum = n * n;
int a

;
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
a[i][j]=0;
}
}
i = j = 0;
while(sum)
{
while(a[i][j] == 0 && i < n)
{
a[i][j] = count;
count++;
i++;
sum--;
}
--i;
++j;
while(a[i][j] == 0 && j < n)
{
a[i][j] = count;
count++;
j++;
sum--;
}
--j;
--i;
while(a[i][j] == 0 && i >= 0)
{
a[i][j] = count;
count++;
i--;
sum--;
}
++i;
--j;
while(a[i][j] == 0 && j >= 0)
{
a[i][j] = count;
count++;
j--;
sum--;
}
++j;
++i;
}
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  逆时针 矩阵