首页 > 解决方案 > 掷硬币计数游戏C++数据结构!

问题描述

这是问题。在游戏中,有一个长方形的硬币网格,正面=1,反面=0。游戏有一个简单的规则:玩家不能抛一枚硬币,而是可以选择一行(或一列)同时翻转该行(或该列)中的所有硬币。游戏的目标是找出一种翻转硬币的策略,以使正面硬币的数量最大化。第一个输入值是行 >> 然后是列 >> 和硬币

Sample inputs:
5 4
1010
0101
1010
1010
1010 //Sample output of this: 20
5 4
0010
1101
0110
0110
1011 //Sample output of this: 17

我使用计数'0'和'1'的方法完成了我的代码,如果零更多,请切换它。这种方法只通过了简单的测试用例,但是当它进入困难的测试用例时,它失败了,因为有些情况需要多次推特。我想不出另一种更好的方法来处理它。

这是我的代码:

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;

bool ConeIsMore(vector <vector<char> > table, int size, int j) {
    int countzero = 0;
    int countone = 0;
    for (int i = 0; i < size; i++) {
        (table[i][j] == '0')?++countzero: ++countone;
    }
    if (countone >= countzero) {
        return true;
    }
    return false;
}

bool RoneIsMore(vector <vector<char> > table, int size, int i) {
    int countzero = 0;
    int countone = 0;
    for (int j = 0; j < size; j++) {
        (table[i][j] == '0') ? ++countzero : ++countone;
    }
    if (countone >= countzero) {
        return true;
    }
    return false;
}

int main() {
    //Initialise row and column
    int row; 
    int column;
    while (cin >> row >> column) {
        //Initiallise 2D vector
        vector <vector<char> > table(row, vector<char>(column));

        //get each digit of number and store it into number
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < column; j++) {
                cin >> table[i][j];
            }
        }

        //check for column
        for (int j = 0; j < column; j++) {
            if (!ConeIsMore(table, row, j)) {
                for (int i = 0; i < row; i++) {
                    (table[i][j] == '0') ? table[i][j] = '1' : table[i][j] = '0';
                }
            }
        }

        //check for row
        for (int j = 0; j < row; j++) {
            if (!RoneIsMore(table, column, j)) {
                for (int i = 0; i < column; i++) {
                    (table[j][i] == '0') ? table[j][i] = '1' : table[j][i] = '0';
                }
            }
        }

        //Count One in the table
        int ans = 0;
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < column; j++) {
                (table[i][j] == '1') ? (ans++) : (ans = ans);
            }
        }
        cout << ans << endl;
    }
    return 0;
}

当我研究测试用例时,我发现有一些需要检查各种时间,这让我觉得我的方法不是一个好方法。任何人都可以提出更好的处理方法吗?太感谢了。

以下是更难的测试用例:

5 4
0010
1101
0110
0110
1011 //17

5 4
0110
1111
0101
0110
0100  //16

5 4
0110
1001
0011
1110
1000 //16

5 4
1100
0001
1111
0101
1010 //16

5 4
0101
0110
1001
1000
0011 //16

5 4
0111
1100
0100
1000
1011 //16

5 4
1101
1110
0111
1011
0111 //15

5 4
1100
1001
0110
1001
1000 //17

标签: c++algorithmcharstructurecoin-flipping

解决方案


你或许应该输出你的策略的结果,而不仅仅是正面的数量,以更好地了解正在发生的事情。改进实施的两个想法:

1)当行或列中有偶数个硬币时,您的代码没有按照您描述的算法执行。你说:

计数'0'和'1',如果零更多,则切换它。

您的代码可以:

if (!ConeIsMore(table, row, j)) {
    // switch it
}

当没有更多的头时它会切换。结果,当硬币数量为偶数时,当正面和反面的数量相等时,您也可以切换。当计数相等时切换是推测性的,尚不清楚它是否会改善任何东西,因此您可能应该特别对待它。

2)您也许可以继续迭代,直到在尾部多于头部的情况下没有列或行。

As of 数据结构std::vector<bool> table(row*column)可能会更有效,但也需要更加小心地正确处理。


推荐阅读