nyoj 33-蛇形填数 (循环,模拟)

33-蛇形填数


内存限制:64MB 时间限制:3000ms Special Judge: No
accepted:15 submit:38

题目描述:

在n*n方陈里填入1,2,...,n*n,要求填成蛇形。例如n=4时方陈为:
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4

输入描述:

直接输入方陈的维数,即n的值。(n<=100)

输出描述:

输出结果是蛇形方陈。

样例输入:

3

样例输出:

7 8 1
6 9 2
5 4 3

提示:

没有提示哦
 
分析:
  ①、考虑如何从A[1][n]模拟蛇形数字的填写过程
  ②、首先来说数字的填写过程是     下--> 左--> 上--> 右 ... 组成的循环
  
  PS:最气的是行列个数n都还没有的到就在用 ::>_<::
 
核心代码:
  
 1 while(nn < cnt)
 2 {
 3     while(I < n && !my_map[I + 1][J])
 4         my_map[++ I][J] = ++ cnt;
 5     while(J > 1 && my_map[I][J - 1])
 6         my_map[I][-- J] = ++ cnt;
 7     while(I > 1 && my_map[I - 1][J])
 8         my_map[-- I][J] = ++ cnt;
 9     while(J < n && my_map[I][J - 1])
10         my_map[I][-- J] = ++ cnt;
11 }

C/C++代码实现(AC):

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <cmath>
 6 #include <stack>
 7 #include <map>
 8 #include <queue>
 9 #include <set>
10 
11 using namespace std;
12 const int MAXN = 105;
13 
14 int main()
15 {
16 
17     int n, nn, my_map[MAXN][MAXN] = {0}, I = 1, J;
18     int cnt = 1;
19     scanf("%d", &n);
20     J = n, nn = n * n, my_map[1][n] = 1;
21     while(cnt < nn)
22     {
23         while(I < n && !my_map[I + 1][J])
24             my_map[++ I][J] = ++ cnt;
25         while(J > 1 && !my_map[I][J - 1])
26             my_map[I][-- J] = ++ cnt;
27         while(I > 1 && !my_map[I - 1][J])
28             my_map[-- I][J] = ++ cnt;
29         while(J < n && !my_map[I][J + 1])
30             my_map[I][++ J] = ++ cnt;
31     }
32     for(int i = 1; i <= n; ++ i)
33     {
34         for(int j = 1; j < n; ++ j)
35             printf("%d ", my_map[i][j]);
36         printf("%d
", my_map[i][n]);
37     }
38     return 0;
39 }
  
原文地址:https://www.cnblogs.com/GetcharZp/p/9069768.html