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
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 }