跳转至

标程

2045:【例5.13】蛇形填数

http://ybt.ssoier.cn:8088/problem_show.php?pid=2045

#include <iostream>
#include <cstdio>

using namespace std;

int a[25][25], n;
int idx;

int main()
{
    cin >> n;

    int i = 1, j = n;
    while (idx < n * n){
        while (i <= n && !a[i][j]) a[i++][j] = ++idx;
        i--, j--;

        while (j >= 1 && !a[i][j]) a[i][j--] = ++idx;
        j++, i--;

        while (i >= 1 && !a[i][j]) a[i--][j] = ++idx;
        i++, j++;

        while (j <= n && !a[i][j]) a[i][j++] = ++idx;
        i++, j--;
    }

    for (int i = 1; i <= n; i++){
        for (int j = 1; j <= n; j++) cout << a[i][j] << ' ';
        puts("");
    }

    return 0;
}
#include<bits/stdc++.h>

using namespace std;

const int N = 25;

int a[N][N], n;
int dx[] = {1, 0, -1, 0}, dy[] = {0, -1, 0, 1};  // delta
int idx = 1;

int main(){
    cin >> n;

    int i = 1, j = n;
    while (idx < n * n){
        for (int k = 0; k < 4; k++){
            while (true){
                a[i][j] = idx++;
                i += dx[k], j += dy[k];
                if (i > n || i < 1 || j > n || j < 1 || a[i][j]){
                    i -= dx[k], j -= dy[k], idx--;
                    break;
                }
            }
        }
    }

    for (int i = 1; i <= n; i++){
        for (int j = 1; j <= n; j++) cout << a[i][j] << ' ';
        puts("");
    }

    return 0;
}

1974:【16NOIP普及组】回文日期

http://ybt.ssoier.cn:8088/problem_show.php?pid=1974

//注意时间复杂度,简单模拟题,细节TLE

#include <bits/stdc++.h>

using namespace std;

int d[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

bool check02(int x)
{
    int a1 = x;
    int a2 = 0;
    while (x)
    {
        a2 = a2 * 10 + x % 10;
        x /= 10;
    }

    if (a1 == a2) return true;
    else return false;

}

bool check03(int x)
{
    if ((x % 4 == 0 && x % 100 != 0) || (x % 400 == 0))
        return true;

    return false;
}

bool check(int x)
{
    int year = x / 10000;
    int month = (x / 100) % 100;
    int date = x % 100;

    if (month > 12) return false;

    bool run = false;
    if (month == 2 && check03(year)) run = true;

    if ((!run && date > d[month]) || (run && month == 2 && date > 29))
        return false;

    return true;
}

int main()
{
    int st, ed;
    scanf("%d%d", &st, &ed);

    int ans = 0;
    for (int i = st; i <= ed; i++)
    {
        if (!check(i))  //非日期数字
            continue;

        if (!check02(i)) 
            continue;
        ans++;
    }

    printf("%d\n", ans);

    return 0;
}

枚举年份,构造回文

#include<bits/stdc++.h>
using namespace std;

int stt, ed, mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int n1, n2;
int sum;

bool check(int x){
    int year = x / 10000;
    int y = x % 10000 / 100, z = x % 100;
    if (y == 0 || y > 12) return false;

    int run = 0;
    if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) run = 1;

    if (y == 2){
        if (z > mon[y] + run) return false;
        return true;
    }
    else{
        if (z > mon[y]) return false;
        return true;
    }

    return true;
}

int main ()
{
    scanf ("%d%d", &stt, &ed);
    n1 = stt / 10000;
    n2 = ed / 10000;

    for (int i = n1; i <= n2; i++) // years
    {
        int now = i, t = i;
        for (int j = 0; j < 4; j++){
            now = now * 10 + t % 10;
            t /= 10;
        }

        if (now < stt) continue;
        if (now > ed) break;

        if (check(now)){
            //printf("---%d\n", now);
            sum++;
        }
    }

    printf ("%d\n", sum);

    return 0;
}

枚举所有日期,判断是否在范围内

#include <bits/stdc++.h>

using namespace std;

int date1, date2;
int ret;

int mon[20] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int main(){
    cin >> date1 >> date2;

    for (int i = 1; i <= 12; i++)
        for (int j = 1; j <= mon[i]; j++){
            int y = i * 100 + j;
            int x = 0, t = y;

            for (int k = 0; k < 4; k++){
                x = x * 10 + t % 10;
                t /= 10;
            }

            x = x * 10000 + y;
            if (x >= date1 && x <= date2) ret++;
        }


    cout << ret << '\n';

    return 0;
}