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都还没有的到就在用 ::>_<::
核心代码:
while(nn < cnt)
{
while(I < n && !my_map[I + ][J])
my_map[++ I][J] = ++ cnt;
while(J > && my_map[I][J - ])
my_map[I][-- J] = ++ cnt;
while(I > && my_map[I - ][J])
my_map[-- I][J] = ++ cnt;
while(J < n && my_map[I][J - ])
my_map[I][-- J] = ++ cnt;
}
C/C++代码实现(AC):
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <stack>
#include <map>
#include <queue>
#include <set> using namespace std;
const int MAXN = ; int main()
{ int n, nn, my_map[MAXN][MAXN] = {}, I = , J;
int cnt = ;
scanf("%d", &n);
J = n, nn = n * n, my_map[][n] = ;
while(cnt < nn)
{
while(I < n && !my_map[I + ][J])
my_map[++ I][J] = ++ cnt;
while(J > && !my_map[I][J - ])
my_map[I][-- J] = ++ cnt;
while(I > && !my_map[I - ][J])
my_map[-- I][J] = ++ cnt;
while(J < n && !my_map[I][J + ])
my_map[I][++ J] = ++ cnt;
}
for(int i = ; i <= n; ++ i)
{
for(int j = ; j < n; ++ j)
printf("%d ", my_map[i][j]);
printf("%d\n", my_map[i][n]);
}
return ;
}