Grey@ 2021-06-07 10:30 采纳率: 0%
浏览 27

POJ上两种编译器的区别在哪?

在做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;
}
  • 写回答

1条回答 默认 最新

  • 有问必答小助手 2021-06-09 23:25
    关注

    你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答

    本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。

    ​​​​因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。

    评论

报告相同问题?

悬赏问题

  • ¥20 C++初高中竞赛题,devc++可以通过的
  • ¥60 二次元手游日常任务自动化代肝(相关搜索:自动化)
  • ¥15 mysql将查询的结果作为动态列名怎么实现
  • ¥50 python自动地图截图脚本
  • ¥20 瑞萨RA4M1芯片刷写为arduino r4 minima
  • ¥15 fastreport怎么判断当前页数
  • ¥15 Kylin-Desktop-V10-GFB-Release-JICAI_02- 2207-Build14-ARM64.iso有没有这个版本的系统啊
  • ¥15 能不能通过蓝牙将传感器数据传送到手机上
  • ¥20 100元python和数据科学实验项目
  • ¥15 根据时间在调用出列表