跳转至

NOIP2014普及组 T3 螺旋矩阵

50pts

模拟回形矩阵,硬刚1<=n<=100

#include <bits/stdc++.h>

using namespace std;

const int N = 110;

int g[N][N];
int n, ex, ey;

void print(){
    for (int i = 1; i <= n; i++){
        for (int j = 1; j <= n; j++)
            printf("%d ", g[i][j]);
        puts("");
    }
}

int main(){
    cin >> n >> ex >> ey;

    int x = 1, y = 1;
    int idx = 1;
    while (idx <= (n * n)){
        while (y <= n && !g[x][y]) g[x][y++] = idx++;
        x++, y--;

        while (x <= n && !g[x][y]) g[x++][y] = idx++;
        x--, y--;

        while (y >= 1 && !g[x][y]) g[x][y--] = idx++;
        x--, y++;

        while (x >= 1 && !g[x][y]) g[x--][y] = idx++;
        x++, y++;
    }

    cout << g[ex][ey] << '\n';

    return 0;
}

100pts

分析一下,这个是一圈一圈填数字的。那么每一圈的起始很重要,只要知道目标点,在哪圈上,我就可以在那个圈上,枚举出来目标点,时间复杂度是 �(�∗4)

#include <bits/stdc++.h>

using namespace std;

int n, x, y;
int ret = 1;

int main(){
    cin >> n >> x >> y;

    int r;
    r = min(n, min(x, n - x + 1)); 
    r = min(r, min(y, n - y + 1));
    //printf("---r %d\n", r);

    int sx = 1, sy = 1;
    for (int i = 1; i < r; i++){
        int delta = n + n + (n - 2) + (n - 2);
        ret += delta, sx++, sy++;
        n -= 2;
    }

    //printf("---ret %d  n %d\n", ret, n);

    for (int j = 1; j < n; j++){
        if (sx == x && sy == y) break;
        sy++;
        ret++;
    }

    for (int i = 1; i < n; i++){
        if (sx == x && sy == y) break;
        sx++;
        ret++;
    }

    for (int j = 1; j < n; j++){
        if (sx == x && sy == y) break;
        sy--;
        ret++;
    }

    for (int i = 1; i < n; i++){
        if (sx == x && sy == y) break;
        sx--;
        ret++;
    }

    cout << ret << '\n';

    return 0;
}