题目描述
国际象棋是一种在棋盘上进行的游戏。国际象棋的棋盘是一个由小方格组成的正方形,马(knight)是国际象棋中的棋子。对于马,每步棋攻击距离其位置两行一列的棋子,或者距离其位置一行两列的棋子。如图 1 所示,标记为 N 的小方格表示马的位置,标记为 X 的小方格表示走一步棋马可以攻击到的小方格。
图 1
在本题中,给出一个 m 行 n 列的棋盘,请您计算最多能放多少个马,使得这些马彼此之间不会互相攻击?m 和 n 都不大于 500。
输入输出格式
输入格式 输入给出若干对 m 和 n 的值,最后以两个 0 标识输入结束。
输出格式 对于每个输入对,输出棋盘的行数和列数,以及最多能放多少个马的个数。
输入输出样例1
输入
2 3
5 5
4 7
0 0
输出
4 knights may be placed on a 2 row 3 column board.
13 knights may be placed on a 5 row 5 column board.
14 knights may be placed on a 4 row 7 column board.
#include <stdio.h>
int a[9][9];
void print()
{
int i,j;
for(i=0;i<9;i++)
{
for(j=0;j<=i;j++)
{
if(j)
{
printf(" ");
}
printf("%d",a[i][j]);
}
printf("\n");
}
}
int main()
{
int t,i,j;
scanf("%d",&t);
while(t--)
{
for(i=0;i<9;i+=2)
{
for(j=0;j<=i;j+=2)
{
scanf("%d",&a[i][j]);
}
}
for(i=8;i>0;i-=2)
{
for(j=1;j<i;j+=2)
{
a[i][j]=(a[i-2][j-1]-a[i][j-1]-a[i][j+1])/2;
}
}
for( i=1;i<9;i+=2)
{
for(j=0;j<=i;j++)
{
a[i][j]=a[i+1][j]+a[i+1][j+1];
}
}
print();
}
}