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)收获
有时候我们觉得某条路走不通的时候,不妨换一个角度试一下。