当前位置:编程学习 > C/C++ >>

uva 696 - How Many Knights

 
题目大意:给出一个n * m的网格,计算最多可以放置几个国际象棋中的骑士。
 
解题思路:分成三类来讨论:
1)min(n, m) == 1, 也就是无论怎么摆也不会影响到其他的骑士。
2)min(n, m) == 2, 这是将网格将网格分成2*4的若干部分,每个部分的前半部分放置骑士,主要注意模4后剩余部分的处理。
3)n *m的网格上间隔摆放(就是对应的黑格子或者白格子)(n * m - 1)/ 2
 
#include <stdio.h>  
  
int f(int n, int m) {  
    if (n < m) return f(m, n);  
    else if (m == 1) return  n;  
    else if (m == 2) {  
        return (n / 4) * 4 + ((n % 4 > 1) ? 2 : n % 4) * 2;  
    }  
    else return (n * m + 1) / 2;  
}  
  
int main () {  
    int r, c;  
    while (scanf("%d%d", &r, &c), r + c) {  
        printf("%d knights may be placed on a %d row %d column board.\n", f(r, c), r, c);  
    }  
    return 0;  
}  

 

 
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,