Skip to content

14148: 【原4148】填数

题目

题目描述

author: cyx666 原OJ链接:https://acm.sjtu.edu.cn/OnlineJudge-old/problem/4148 ## Description

给定一个n行m列的数组,要求从左上角按顺时针或逆时针的顺序依次填入1到m*n。

Input Format

一行,三个空格隔开的整数n,m,p。

p为1表示顺时针,为0表示逆时针。

Output Format

一个n行m列的数组,用空格隔开。

Sample Input1

2 2 1

Sample Output1

1 2
4 3

Sample Input2

3 3 0

Sample Output2

1 8 7
2 9 6
3 4 5

Data Range

对于20%的数据,n=m

对于另外20的数据,n=1或m=1

对于100%的数据,1<=n,m<=1000

satgo1546's solution

#include <stdio.h>

// 全局变量初始化为零
int a[1001][1001];
int n, m, p;

int main(int argc, char *argv[]) {
    scanf("%d%d%d", &n, &m, &p);
    int i = 0, j = 0;
    // i + dij + dj指示行进方向
    int di = !p, dj = p;
    int k;
    for (k = 1; k <= n * m; k++) {
        a[i][j] = k;
        i += di;
        j += dj;
        if (i < 0 || j < 0 || i >= n || j >= m || a[i][j]) {
            i -= di;
            j -= dj;
            // 复数乘法是旋转
            di ^= dj;
            dj ^= di;
            di ^= dj;
            *(p ? &dj : &di) *= -1;
            i += di;
            j += dj;
        }
    }
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
            printf("%d%c", a[i][j], j == m - 1 ? '\n' : ' ');
        }
    }
    return 0;
}