在做POJ上的1681的画家问题时(http://poj.org/problem?id=1681),程序用G++提交可以通过,但是用C++提交就一直显示Runtime Error。在看了F.A.Qs之后发现用C++提交使用的编译器是MS VC++ 2008 Express,而用G++提交使用的编译器是MinGW GCC 4.4.0。不明白为什么完全相同的代码在在不同编译器下结果完全不同,我在本地配置的编译器是g++(g++ -pedantic-errors -Wall -Weffc++ -Wextra -Wsign-conversion -std=c++17)。
我的程序如下:
#include <iostream>
#include <string>
int puzzle[16][17];
int press[16][17];
int n;
int result[15] = {0};
int guess(int min);
int enumerate();
int main()
{
int cases, r, c;
std::cin >> cases;
for (int i = 0; i < cases; i++)
{
std::cin >> n;
for (r = 0; r < n + 1; r++) // 将按钮矩阵左右边界置为0
{
press[r][0] = press[r][n+1] = 0;
}
for (c = 1; c < n + 1; c++) // 将按钮矩阵第0行置零
{
press[0][c] = 0;
}
// 使用字符进行输入
char ch;
for (r = 1; r < n + 1; r++) // 读入初始矩阵
{
for(c = 1; c < n + 1; c++)
{
std::cin >> ch;
puzzle[r][c] = ch=='w' ? 1 : 0; // 黄为0,白为1
}
}
// 使用字符串进行输入
// std::string row;
// for (r = 1; r < n + 1; r++)
// {
// std::cin >> row;
// for (c = 1; c < n + 1; c++)
// {
// puzzle[r][c] = (row[c-1]=='w') ? 1 : 0;
// }
// }
result[i] = enumerate();
}
for (int i = 0; i < cases; i++)
{
if (result[i] >= 0)
{
std::cout << result[i] << std::endl;
}
else
{
std::cout << "inf" << std::endl;
}
}
return 0;
}
int guess(int min)
{
int c, r, step = 0;
// 根据press第1行和puzzle数组,计算press其他行的值
for (r = 1; r < n; r++)
{
for (c = 1; c < n + 1; c++)
{
press[r+1][c] = (puzzle[r][c] + press[r][c] +
press[r-1][c] + press[r][c-1] + press[r][c+1]) % 2;
if (press[r+1][c])
{
step++;
// 已不可能是最小涂画数的话就没必要再计算
if (min >= 0 && step > min)
{
return -2;
}
}
}
}
// 试验最后一行是否正确
for (c = 1; c < n + 1; c++)
{
if ((press[n][c-1] + press[n][c] + press[n][c+1] +
press[n-1][c]) % 2 != puzzle[n][c])
{
return -1;
}
}
//加上第一行的涂画数
for (c = 1; c < n + 1; c++)
{
if (press[1][c])
{
step++;
}
}
return step;
}
int enumerate()
{
int min = -1;
int c;
for (c = 1; c < n + 1; c++)
{
if (puzzle[n][c])
{
break;
}
}
// 初始最后一行就全是黄砖
if (c > n)
{
return 0;
}
for (c = 1; c < n + 2; c++)
{
press[1][c] = 0;
}
int temp = -1;
// 遍历第一行的所有情况
while (press[1][n+1] < 1)
{
temp = guess(min);
if (temp >= 0)
{
if ((min == -1) || (temp < min))
{
min = temp;
}
}
press[1][1]++;
c = 1;
// 需要进位并且未达到有效网格中最后一位
while (press[1][c] > 1)
{
press[1][c] = 0;
c++;
press[1][c]++;
}
}
return min;
}