在m行n列的棋盘上,放尽可能多的马,以使相互间不能被吃掉。编程给出最大可放置的马的数量及其放置方法。老师要求用计算机知道怎么放马,为什么这样放是最多的。
在国际象棋中,马每走一步,是从黑格跳到白格或从白格跳到黑格,为了马相互之间不能被吃掉,所有马必须放在同色的格子上。这题就转变为把m行n列的棋盘划分为黑白相间的格子,然后统计哪种颜色的格子多,就把马多放在那种颜色的格子。
二维数组,放满即可。马走日, 象走田,车走直路炮翻山,士走斜线护将边,小卒一去不回还。 车走直路马踏斜,象飞田字炮打隔,卒子过河了不得。这是常见的象棋走法口诀。m行n列的棋盘,可考虑使用二维数组去存储,放尽可能多的马,以使相互间不能被吃掉。根据这两句口诀:马走日以及车走直路马踏斜。而且马踏斜时,有绊蹄子的说法,所以考虑到这些。基本上就可以尝试实现了。
希望对题主有所帮助,望采纳!
#include <iostream>
#include <vector>
int main()
{
int m, n;
std::cin >> m >> n;
std::vector<int> a(m * n);
int black = 0, white = 0;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if ((i + j) % 2 == 0)
{
a[i * n + j] = 0;
black++;
}
else
{
a[i * n + j] = 1;
white++;
}
}
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
printf("%d ", a[i * n + j]);
printf("\n");
}
printf("0: black, 1: white\n");
if (black > white)
printf("Place horses on black(0) sqaures. Total: %d horses\n", black);
else if (white > black)
printf("Place horses on white(1) sqaures. Total: %d horses\n", black);
else
printf("Place horses on either black(0) or white(1) sqaures. Total: %d horses\n", black);
return 0;
}
因为可以憋马脚,所以棋盘放满就行
同意楼上观点,放满就行