我在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;
}
答案 0 :(得分:0)
M&#39; M&#39;被错误输入为&#39; N&#39;。解决问题。