Knights Gym - 101522K

Knights Gym - 101522K


题目链接

题意:
国王要派他的骑士们去占领一个领地(N*M的矩阵),要想获得胜利,矩阵的每一格上都必须有一个骑士。
国王想了想,把占领过程分为两个阶段。
第一阶段:先派一定数量的骑士去特定的位置。
第二阶段:任何时刻,只要有两个骑士在同一行或者同一列,并且两个骑士之间有并未被占领的领地,国王会立刻派骑士占领它们,直到没有更多的领地可以占领,结束第二阶段的占领。
(题中,左上图是第一阶段结束。右上->左下图是第二阶段开始至结束。)

题目问的是,现在第一阶段的占领已经结束了,在第二阶段的占领开始之前,还要派多少骑士?
一方面:要确保能够完全占领。
另一方面:派遣最少数量的骑士。

注意一下:
骑士一旦被派去领地后不许移动。
不会有两个骑士派去同一个领地。

思路:
一开始,我被题目中的图给误导了。后面在朋友的提醒下,我才知道只要考虑4个角就OK了。在第二个阶段开始之前,只要4个角上都有骑士,第二阶段后肯定可以完全占领,同时,也做到了派遣最少数量的骑士。不过要判断一下,领地只有一格/一行/一列的情况。

(1)初始版本

#include <stdio.h>

int
main() {
    int n, m, k, x, y, i, j, sum = 0;
    int kmap[105][105];

    scanf("%d %d %d", &n, &m, &k);
    for( i = 0; i < n; i++ ) {
        for( j = 0; j < m; j++ ) {
            kmap[i][j] = 0;
        }
    }
    while( k-- ) {
        scanf("%d %d", &x, &y);
        kmap[x][y] = 1;
    }
    if( n == 1 && m == 1 ) {
        if( kmap[n][m] == 1 ) {
            printf("0\n");
        }
        else {
            printf("1\n");
        }
    }
    else if( n == 1 ) {
        if( kmap[1][1] == 1 ) {
            sum++;
        }
        if( kmap[1][m] == 1 ) {
            sum++;
        }
        printf("%d\n", 2 - sum);
    }
    else if( m == 1 ) {
        if( kmap[1][1] == 1 ) {
            sum++;
        }
        if( kmap[n][1] == 1 ) {
            sum++;
        }
        printf("%d\n", 2 - sum);
    }
    else {
        if( kmap[1][1] == 1 ) {
            sum++;
        }
        if( kmap[n][m] == 1 ) {
            sum++;
        }
        if( kmap[1][m] == 1 ) {
            sum++;
        }
        if( kmap[n][1] == 1 ) {
            sum++;
        }
        printf("%d\n", 4 - sum);
    }

    return 0;
}

(2)小优化

#include <stdio.h>

int
main() {
    int n, m, k, x, y, i, j, sum = 0;
    int kmap[105][105];

    scanf("%d %d %d", &n, &m, &k);
    for( i = 0; i < n; i++ ) {
        for( j = 0; j < m; j++ ) {
            kmap[i][j] = 0;
        }
    }
    while( k-- ) {
        scanf("%d %d", &x, &y);
        kmap[x][y] = 1;
    }
    if( kmap[1][1] == 1 ) {
        sum++;
    }
    if( kmap[1][m] == 1 ) {
        sum++;
    }
    if( kmap[n][1] == 1 ) {
        sum++;
    }
    if( kmap[n][m] == 1 ) {
        sum++;
    }
    if( n == 1 && m == 1 ) {
        printf("%d\n", 1 - sum / 4);
    }
    else if( n == 1 || m == 1 ) {
        printf("%d\n", 2 - sum / 2);
    }
    else {
        printf("%d\n", 4 - sum);
    }

    return 0;
}

(3)else if, WA?

#include <stdio.h>

int
main() {
    int n, m, k, x, y, i, j, sum = 0;
    int kmap[105][105];

    scanf("%d %d %d", &n, &m, &k);
    for( i = 0; i < n; i++ ) {
        for( j = 0; j < m; j++ ) {
            kmap[i][j] = 0;
        }
    }
    while( k-- ) {
        scanf("%d %d", &x, &y);
        kmap[x][y] = 1;
    }
    /*
    else if, WA?
    因为当领地只有一格/一行/一列,if() / else if()中的条件并不是互相独立的。
    下面我写了一个简单的测试的例子。
    */
    if( kmap[1][1] == 1 ) {
        sum++;
    }
    else if( kmap[1][m] == 1 ) {
        sum++;
    }
    else if( kmap[n][1] == 1 ) {
        sum++;
    }
    else if( kmap[n][m] == 1 ) {
        sum++;
    }
    if( n == 1 && m == 1 ) {
        printf("%d\n", 1 - sum / 4);
    }
    else if( n == 1 || m == 1 ) {
        printf("%d\n", 2 - sum / 2);
    }
    else {
        printf("%d\n", 4 - sum);
    }

    return 0;
}
/*
输出:
1

ans: 1

*/
#include <stdio.h>

int
main() {
    int a = 1, ans = 0;

    if( a == 1 ) {
        ans++;
        printf("1\n");
    }
    else if( a == 1 ) {
        ans++;
        printf("2\n");
    }
    else if( a == 1 ) {
        ans++;
        printf("3\n");
    }
    else {
        ans++;
        printf("4\n");
    }
    printf("\nans: %d\n", ans);

    return 0;
}

(4)收获

有时候我们觉得某条路走不通的时候,不妨换一个角度试一下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值