蛇形填数
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
在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
-
-
被坑了,一组测试数据,算法经典上的代码直接复制过来了
-
#include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<ctype.h> #include<stdlib.h> #include<string> #include<algorithm> #include<vector> #include<set> #include<map> #include<list> #include<queue> #include<stack> #include<iomanip> #include<numeric> #include <istream> //基本输入流 #include <ostream> //基本输出流 #include <sstream> //基于字符串的流 #include <utility> //STL 通用模板类 #include <complex.h> //复数处理 #include <fenv.h> //浮点环境 #include <inttypes.h> //整数格式转换 #include <stdbool.h> //布尔环境 #include <stdint.h> //整型环境 #include <tgmath.h> //通用类型数学宏 #define L(a,b,c) for(int a = b;a >= c;a --) #define M(a,b,c) for(int a = b;a < c;a ++) #define N(a,b) memset(a,b,sizeof(a)); const int INF=1<<31; const int inf=-INF; typedef int T; typedef double D; typedef char C; using namespace std; int a[111][111],n; int main() { int x,y; scanf("%d",&n); int t; N(a,0) t = 1; a[x = 0][y = n-1] = 1; for(;t<n*n;) { while(x + 1 < n && !a[x + 1][y]) a[++ x][y] = ++ t; while(y - 1 >= 0 && !a[x][y - 1]) a[x][-- y] = ++ t; while(x - 1 >= 0 && !a[x - 1][y]) a[-- x][y] = ++ t; while(y + 1 < n && !a[x][y + 1]) a[x][++ y] = ++t; } M(i,0,n) { M(j,0,n) printf("%d ",a[i][j]); printf("\n"); } }