这里的链接的问题:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=13&page=show_problem&problem=1130UVA 10189:扫雷
这是我的代码,它完美的作品;然而,只要我提交它就会给出错误的答案。有人知道为什么吗?
注:我用2个额外的行和列填充矩阵,以便当我检查第一列的左边或最后一行的底部时,我不会收到错误。
//A minesweeper generator
#include <iostream>
#include <sstream>
using namespace std;
char arr[102][102]; //2D dynamic array used temporarily
int main() {
int n, m; //Rows and columns
int count = 0, recordNum = 0; //Number of mines around the current dot
while(true) { //Keep processing records until "0 0" is encountered
cin >> n >> m;
if(n == 0 && m == 0) //End of input
break;
//Read the values into the array
for(int i = 1; i < n+1; i++) { //Rows
for(int j = 1; j < m+1; j++) { //Columns
cin >> arr[i][j];
}
}
//Process the values of the array and generate the numbers
for(int i = 1; i < n+1; i++) { //Rows
for(int j = 1; j < m+1; j++) { //Columns
if(arr[i][j] == '*')
continue;
else { //Count the number of mines around this dot
if(arr[i-1][j-1] == '*')
count++;
if(arr[i-1][j] == '*')
count++;
if(arr[i-1][j+1] == '*')
count++;
if(arr[i][j-1] == '*')
count++;
if(arr[i][j+1] == '*')
count++;
if(arr[i+1][j-1] == '*')
count++;
if(arr[i+1][j] == '*')
count++;
if(arr[i+1][j+1] == '*')
count++;
}
//Create a buffer to convert the count to a char
stringstream buffer;
buffer << count;
arr[i][j] = buffer.str().at(0);
count = 0; //Finally reset the counter
}
}
if(recordNum > 0)
cout << endl;
recordNum++;
cout << "Field #" << recordNum << ":\n";
//Output the values
for(int i = 1; i < n+1; i++) { //Rows
for(int j = 1; j < m+1; j++) { //Columns
cout << arr[i][j];
}
cout << endl;
}
}
return 0;
}
@Neil流缓冲区,它使代码,如果你有更复杂检查循环中的边界条件。我认为在它周围添加1行边框是一个完美的解决方案。 – 2011-05-31 16:35:49
@Jeff我不确定它的确如此 - 它肯定会让有经验的C++程序员难以阅读 - 所有这些+1。只是看了一眼,我认为他有一个错误 - 因此我原来的评论。 – 2011-05-31 16:42:45