NYOJ——33 蛇形填数

蛇形填数

时间限制: 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");
    }
}

你可能感兴趣的:(算法,ACM,nyoj)