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都还没有的到就在用 ::>_<::
 
核心代码:
  

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

  

05-11 15:53