我在SPOJ中提交Bitmap的错误答案

时间:2017-01-18 11:24:57

标签: graph-theory breadth-first-search

我在SPOJ中获得了对Bitmap(http://www.spoj.com/problems/BITMAP/)解决方案的错误答案。

问题描述:由ONE和ZERO组成的矩阵,对于每个ZERO,我们需要找到矩阵中距离最近的ONE的距离。在测量矩阵中两点之间的距离时,可以逐一向上,向下,向左或向右移动。

以下解决方案适用于我的测试用例。我在向法官提交时,我不确定为什么会失败,这里是代码:

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;

#define INF 9999999999

int main() {
    int T, M, N;
    cin >> T;

    vector<pair<int, int>> shift;
    shift.push_back(make_pair(0, -1));  // Left
    shift.push_back(make_pair(0, 1));   // Right
    shift.push_back(make_pair(1, 0));   // Down
    shift.push_back(make_pair(-1, 0));  // Up

    while ( T-- ) {
        cin >> M >> N;
        int arr[M][N];
        int result[M][N];
        memset(arr, 0, sizeof(arr));

        queue<pair<int, int>> q;
        for(int i=0; i<M; i++) {
            string input;
            cin >> input;

            for(int j=0; j<N; j++) {
                result[i][j] = INF;
                arr[i][j] = input[j] - '0';
                if (arr[i][j]) {
                    q.push(make_pair(i, j));
                    result[i][j] = 0;
                }
            }
        }

        q.push(make_pair(-1, -1));
        while (!q.empty()) {
            pair<int, int> p = q.front();
            q.pop();
            if (p.first == -1 && !q.empty()) { 
                q.push(make_pair(-1, -1));
            } else {
                for(int i=0; i<shift.size(); i++) {
                    if (p.first + shift[i].first >= 0 && p.first + shift[i].first < N &&
                        p.second + shift[i].second >= 0 && p.second + shift[i].second < N) {
                        if (!arr[p.first + shift[i].first][p.second + shift[i].second]) {
                             if (result[p.first + shift[i].first][p.second + shift[i].second] > 1 + result[p.first][p.second]) {
                                result[p.first + shift[i].first][p.second + shift[i].second] = 1 + result[p.first][p.second];
                                q.push(make_pair(p.first + shift[i].first, p.second + shift[i].second));
                            }
                        }
                    }
                }
            }
        }

        for(int i=0; i<M; i++) {
            for(int j=0; j<N; j++) {
                cout << result[i][j];
                if (j<N-1) cout << " ";
            }
            cout << endl;
        }
    }

    return 0;
}

1 个答案:

答案 0 :(得分:0)

M&#39; M&#39;被错误输入为&#39; N&#39;。解决问题。