棋盘放马问题,要求用c++

在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;
}

因为可以憋马脚,所以棋盘放满就行

同意楼上观点,放满就行