逆时针蛇形排列矩阵
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循环中行走的方向即可。
附上代码:
有一个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; }
相关文章推荐
- java蛇形矩阵输出方法(顺时针、逆时针)
- 输出10*10蛇形排列矩阵
- 1160蛇形矩阵
- 17.蛇形矩阵(模拟)
- 【面试】输出"蛇形"矩阵
- 腾讯2016软开实习生笔试题-编程1:蛇形矩阵
- java顺时针、逆时针打印矩阵
- 蛇形矩阵
- 蛇形矩阵 c 语言实现
- 蛇形排列 非递归
- 对于一个m*n的整数矩阵,其中每一行和每一列的元素都按升序排列,设计一个高效的算法判断一个数值是否存在,并给出位置
- 对面试题“输入n,求一个nXn矩阵,规定矩阵沿45度递增,形成一个zigzag数组(JPEG编码里取像素数据的排列顺序),请问如何用C++实现?”的理解
- 蛇形矩阵
- 17.蛇形矩阵(模拟)
- Java排列矩阵
- 1160 蛇形矩阵
- 【JAVA】腾讯研发类在线笔试题之蛇形矩阵实现
- java顺时针、逆时针打印矩阵
- 随便写的蛇形矩阵
- 算法题:蛇形打印矩阵