poj 2965 The Pilots Brothers' refrigerator (枚举)

来源:互联网 发布:java做计算器 编辑:程序博客网 时间:2024/05/18 09:55

题意是类似黑白棋的游戏,当翻转一个 + 的时候,那一行列的都会被翻转。

求最小的翻转次数以及翻转过程。

直接上解析:

先看一个简单的问题,如何把'+'变成'-'而不改变其他位置上的状态?

答案是将该位置(i,j)及位置所在的行(i)和列(j)上所有的handle更新一次。

结果该位置被更新了7次,相应行(i)和列(j)的handle被更新了4次,剩下的被更新了2次.

被更新偶数次的handle不会造成最终状态的改变.

因此得出高效解法,在每次输入碰到'+'的时候, 计算所在行和列的需要改变的次数

当输入结束后,遍历数组,所有为奇数的位置则是操作的位置,而奇数位置的个数之和则是最终的操作次数.

注:该题不会有不可能的情况。


代码:

#include <iostream>#include <string>using namespace std;int main(){    char GIRD[5][5];    int gird[5][5];    string str[5];    while (cin >> str[0])    {        cin >> str[1];        cin >> str[2];        cin >> str[3];        for (int i = 0; i < 4; i++)        {            for (int j = 0; j < 4; j++)            {                gird[i][j] = 0;            }        }        for (int i = 0; i < 4; i++)        {            for (int j = 0; j < 4; j++)            {                GIRD[i][j] = str[i][j];                if (GIRD[i][j] == '+')                {                    gird[i][j]++;                    for (int k = 0; k < 4; k++)                    {                        gird[i][k]++;                        gird[k][j]++;                    }                }            }        }        int count = 0;        for (int i = 0; i < 4; i++)        {            for (int j = 0; j < 4; j++)            {                //cout<<gird[i][j]<<" ";                if (gird[i][j] % 2 == 1)                    count++;            }            //cout<<endl;        }        cout << count << endl;        for (int i = 0; i < 4; i++)        {            for (int j = 0; j < 4; j++)            {                if (gird[i][j] % 2 == 1)                    cout << i + 1 <<" "<< j + 1 << endl;            }        }    }    return 0;}


0 0
原创粉丝点击