算法题:蛇形打印矩阵

  1 // Snake.cpp : print matric(n*n)。
  2 //////////// n=3:
  3 // 1 2 6
  4 // 3 5 7
  5 // 4 8 9
  6 //////////// n=4:
  7 // 1  2  6  7
  8 // 3  5  8  13
  9 // 4  9  12 14
 10 // 10 11 15 16
 11
 12 #include "stdafx.h"
 13 #include "vector"
 14 #include "deque"
 15 #include "algorithm"
 16 #include "iostream"
 17 #include "iomanip"
 18
 19 using namespace std;
 20
 21 //辅助矩阵matric
 22 //           vector
 23 //             ||
 24 //             \/
 25 //1         <--deque
 26 //2 3       <--deque
 27 //6 5 4     <--deque
 28 //7 8       <--deque
 29 //9         <--deque
 30 vector<deque<int>> matric;
 31
 32
 33 //初始化辅助矩阵:
 34 //1
 35 //2 3
 36 //4 5 6
 37 //7 8
 38 //9
 39 void Init(int n)
 40 {
 41     matric.clear();
 42     int row = n * 2 - 1;
 43     int col = 0;
 44     int t = 1;
 45     for (int i = 1; i <= row; ++i) {
 46         if (i <= n) col = i;
 47         else col = row - i + 1;
 48         deque<int> vec;
 49         for (int j = 1; j <= col; ++j) {
 50             vec.push_back(t);
 51             t++;
 52         }
 53         matric.push_back(vec);
 54     }
 55
 56 }
 57
 58 //将辅助矩阵的奇数行逆序:  59 //1
 60 //2 3
 61 //6 5 4
 62 //7 8
 63 //9
 64 void Adjust(int n)
 65 {
 66     int row = n * 2 - 1;
 67     for (int i = 1; i <= row; ++i) {
 68         if (i % 2 == 1) {
 69             reverse(matric.at(i-1).begin(), matric.at(i-1).end());
 70         }
 71     }
 72 }
 73
 74 void PrintInt(const int& n)
 75 {
 76     cout << setw(3) << n;
 77 }
 78
 79 //打印辅助矩阵for testing
 80 void PrintMatric(int n)
 81 {
 82     int row = n * 2 - 1;
 83     int col = 0;
 84
 85     for (int i = 1; i <= row; ++i) {
 86         for_each(matric.at(i - 1).begin(), matric.at(i - 1).end(), PrintInt);
 87         cout << endl;
 88     }
 89 }
 90
 91 // 蛇形打印
 92 // from matric:
 93 //1
 94 //2 3               1 2 6
 95 //6 5 4     to      3 5 7
 96 //7 8               4 8 9
 97 //9
 98 //
 99 //n=4:
100 //
101 //1
102 //2  3
103 //6  5  4               1  2  6  7  15
104 //7  8  9  10           3  5  8  14 16
105 //15 14 13 12 11   to   4  9  13 17 22
106 //16 17 18 19           10 12 18 21 23
107 //22 21 20              11 19 20 24 25
108 //23 24
109 //25
110 // 打印前n个非空的deque的首元素,并pop_front
111 void PrintSnake(int n)
112 {
113     int row = n * 2 - 1;
114     for (int i = 1; i <= row; ++i) {
115         if (matric.at(i-1).size() == 0)
116             continue;
117         for (int j = 0; j < n; ++j) {
118             cout << setw(3) << matric.at(i-1+j).front();
119             matric.at(i-1+j).pop_front();
120         }
121         cout << endl;
122     }
123 }
124
125 int _tmain(int argc, _TCHAR* argv[])
126 {
127     int n;
128     while (true) {
129         cin >> n;
130         if (n <= 0) break;
131         Init(n);
132         cout << "init:" << endl;
133         PrintMatric(n);
134         Adjust(n);
135         cout << "adjust:" << endl;
136         PrintMatric(n);
137         cout << "snake:" << endl;
138         PrintSnake(n);
139     }
140
141     return 0;
142 }
时间: 2024-08-01 05:17:38

算法题:蛇形打印矩阵的相关文章

算法题:打印1到最大的n位数

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 今天看到剑指offer上的第12题,题目例如以下: 输入数字n.按顺序打印出从1到最大的n位十位数. 比方输入3,则打印出1,2,3,...,999. 当我看到这个题目的时候.第一感觉就是用递归,为什么呢?首先得从我们的一个实际数字出发,比方123.我们对数字加1,实际上分为例如以下两个步骤: 步骤1:最低位加1: 步骤2:若发生进位,则向更高位传播该进位的影响(这也是递归的所在). 在完毕这个算法题之前.我想插一句"细节决定成败!"

剑指offer第十八题 顺时针打印矩阵

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 解题思路:一次去掉一个外圈,当最后只剩一行或一列时停止递归.(ps:这题就是绕,仔细点就解决了!!!) 1 import java.util.ArrayList; 2 public class Solution { 3 publ

[算法]“之”字形打印矩阵

题目: 给定一个矩阵matrix,按照“之”字形的方式打印这个矩阵.例如: 1   2   3   4 5   6   7   8 9  10  11 12 “之”字形打印的结果为:1,2,5,9,6,3,4,7,10,11,8,12 要求额外的空间复杂度为O(1). 思路: 1.上坐标(tR,tC)的初始为(0,0),先沿着矩阵的第一行移动(tC++),当达到第一行最右边的元素后,再沿着矩阵最后一列移动  (tR++). 2.下坐标(dR,dC)的初始为(0,0),先沿着矩阵的第一列移动(dR

数据结构与算法设计--顺时针打印矩阵

题目 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,举例,如果输入的矩阵是下面这个样子 \[\left[ {\begin{array}{*{20}{c}}1&2&3&4\\5&6&7&8\\9&{10}&{11}&{12}\\{13}&{14}&{15}&{16}\end{array}} \right]\] 则依次打印出数字1.2.3..4.8.12.16.15.14.13.9.5.6.7.11

力扣算法题—085最大矩阵

给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积. 示例: 输入: [ ["1","0","1","0","0"], ["1","0","1","1","1"], ["1","1","1","1&quo

Java算法题3.打印出所有的“水仙花数”。

[原创 转载注明出处] 题目3:打印出100-999所有的“水仙花数”. 思路: 水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身. (例如:1^3 + 5^3+ 3^3 = 153) Java代码实现 1 package jichu; 2 3 public class jichu3 4 { 5 public static void main(String[] args) 6 { 7 int b, s, g; 8 for(int i = 100; i <

算法题,打印沙漏

#include <iostream> using namespace std; int sak(int z) { return 1 + 4 * z + 2 * z * z; } int main() { int x; char a; cin >> x >> a; //cout << x << a << endl; int n = 0; //cout << sak(n + 1) << endl; while(!

笔试算法题(26):顺时针打印矩阵 &amp; 求数组中数对差的最大值

出题: 输入一个数字矩阵,要求从外向里顺时针打印每一个数字: 分析: 从外向里打印矩阵有多重方法实现,但最重要的是构建合适的状态机,这样才能控制多重不同的操作: 注意有四种打印模式(左右,上下,右左,下上),所以需要一个index变量控制每次循环时执行的打印模式: 注意水平打印和垂直打印分别需要两个变量控制打印元素,并且两组变量中的两个端点都是相互靠近的(hs和he,vs和he),每执行一种打印模式之前,需要更新当前打印模式中打印方向的其实坐标,因为它已经在上一种打印模式中打印过: 每一种打印模

笔试算法题(20):寻找丑数 &amp; 打印1到N位的所有的数

出题:将只包含2,3,5的因子的数称为丑数(Ugly Number),要求找到前面1500个丑数: 分析: 解法1:依次判断从1开始的每一个整数,2,3,5是因子则整数必须可以被他们其中的一个整除,如果不包含任何其他因子则最终的结果为1: 解法2:小丑数必然是某个大丑数的因子,也就是乘以2,3,或者5之后的值,所以可以利用已经找到的丑数来寻找下一个丑数,使用数组有序保存已经找到的丑 数,并且当前最大丑数值为M:用大于M/2的丑数乘以2得到M1,用大于M/3的丑数乘以3得到M2,用大于M/5的丑数