1. 程式人生 > >CodeForces-816C Karen and Game 水題

CodeForces-816C Karen and Game 水題

CodeForces-816C Karen and Game

題意: 給定一個矩陣, 可以把一個全是0的矩陣通過給一行或一列加1到達這個矩形, 問方式(spical judge), 若不能輸出-1.
分析: 純暴力模擬一下, 矩陣的大小不超過100.
程式碼:

#include <iostream>
#include <cstdio>

using namespace std;

const int MAXN = 105;
int a[MAXN * MAXN * MAXN], f[MAXN * MAXN * MAXN], g[MAXN][MAXN];
int main()
{
    int n, m;
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            scanf("%d", &g[i][j]);
    int cnt = 0;
    int flag2 = 0;
    if (n < m)
    {
        while (flag2 < n)
        {
            flag2 = 0;
            for (int i = 0; i < n; i++)
            {
                bool flag = true;
                for (int j = 0; j < m; j++)
                    if (!g[i][j])
                    {
                        flag = false;
                        break;
                    }
                if (flag)
                {
                    for (int j = 0; j < m; j++)
                    {
                        g[i][j]--;
                    }
                    f[++cnt] = 0;
                    a[cnt] = i;
                }
                if (!flag)
                    flag2++;
            }
            // cout << flag2 << endl;
        }
        flag2 = 0;
        while (flag2 < m)
        {
            flag2 = 0;
            for (int i = 0; i < m; i++)
            {
                bool flag = true;
                for (int j = 0; j < n; j++)
                    if (!g[j][i])
                    {
                        flag = false;
                        break;
                    }
                if (flag)
                {
                    for (int j = 0; j < n; j++)
                    {
                        g[j][i]--;
                    }
                    f[++cnt] = 1;
                    a[cnt] = i;
                }
                if (!flag)
                    flag2++;
            }
        }
    }
    else
    {
        flag2 = 0;
        while (flag2 < m)
        {
            flag2 = 0;
            for (int i = 0; i < m; i++)
            {
                bool flag = true;
                for (int j = 0; j < n; j++)
                    if (!g[j][i])
                    {
                        flag = false;
                        break;
                    }
                if (flag)
                {
                    for (int j = 0; j < n; j++)
                    {
                        g[j][i]--;
                    }
                    f[++cnt] = 1;
                    a[cnt] = i;
                }
                if (!flag)
                    flag2++;
            }
        }
        flag2 = 0;
        while (flag2 < n)
        {
            flag2 = 0;
            for (int i = 0; i < n; i++)
            {
                bool flag = true;
                for (int j = 0; j < m; j++)
                    if (!g[i][j])
                    {
                        flag = false;
                        break;
                    }
                if (flag)
                {
                    for (int j = 0; j < m; j++)
                    {
                        g[i][j]--;
                    }
                    f[++cnt] = 0;
                    a[cnt] = i;
                }
                if (!flag)
                    flag2++;
            }
            // cout << flag2 << endl;
        }
    }

    bool flag = true;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            if (g[i][j])
            {
                flag = false;
                break;
            }
        }
    }

    if (!flag)
    {
        cout << -1 << endl;
    }
    else
    {
        cout << cnt << endl;
        for (int i = 1; i <= cnt; i++)
        {

            if (!f[i])
                cout << "row ";
            else
                cout << "col ";
            cout << a[i] + 1 << endl;
        }
    }
    return 0;
}