为什么#2错了,明明#2的数据点也对了
查看原帖
为什么#2错了,明明#2的数据点也对了
1460981
zdxc1987楼主2024/12/26 13:32
const int N = 35;  
int g[N][N];
int n;
int move_x[6] = { 0,-1,0,1,0 };
int move_y[6] = { 0,0,1,0,-1 };
int save[35][35];  //  储存到时候需要输入2的坐标
bool gi[N][N];  //  地图的状态,没有状态的话它就会一直死循环操作   1 代表使用过了


queue <pair<int, int>> q;

int bfs(int x, int y)
{
    int judge = 0;
    int ret = 0;
    memset(gi, -1, sizeof(gi));
    memset(save, 0, sizeof(save));   //  每次进来都要先全部赋值为-1
    gi[x][y] = 1;
    save[x][y] = 2;
    q.push({ x,y });
    while (q.size() && judge == 0)
    {
        judge = 0;
        pair<int, int> temp = q.front();
        q.pop();
        for (int i = 1; i <= 4; i++)  //  遍历
        {
            int a = temp.first + move_x[i]; int b = temp.second + move_y[i];
            if (a < 1 || a > n || b < 1 || b > n) continue;
            if (g[a][b] == 1) continue;
            if (gi[a][b] == 1) continue;   //  状态判断
            if ((g[a][b] == 0) && (a == 1 || a == n || b == 1 || b == n))
            {
                judge = 1;  //  判断有没有遇到过边界
                break;
            }
            q.push({ a,b });  //  入队不是为了加值才入队,是为了这一层遍历结束后,在使用它的
            gi[a][b] = 1;
            save[a][b] = 2;
        }
    }
    if (judge == 0)
        return 1;
    if (judge == 1)
        return 0;

}


int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            cin >> g[i][j];
    for(int i = 2; i <= n - 1; i++)   //  不用算完,边界不需要
        for (int j = 2; j <= n - 1; j++)
        {
            memset(save, 0, sizeof(save));
            while (!q.empty())    //  清理队列
            {
                q.pop();
            }
            if (g[i][j] == 0)
            {
                if (bfs(i, j))   //  为真就开始打印
                {
                    for (int i = 1; i <= n; i++)
                    {
                        for (int j = 1; j <= n; j++)
                        {
                           
                            
                                if (save[i][j] == 2)
                                    cout << 2 << " ";
                                else
                                    cout << g[i][j] << " ";
                            
                            
                        }
                      
                        cout << endl;
                    }
                    return 0;   //  成功打印完一次就直接结束循环了
                }

            }
        }
    //  移动到这一步就代表着闭合圈内可能啥都没有,加一段输出吧
    for (int i = 1; i <= n; i++)   //  不用算完,边界不需要
    {
        for (int j = 1; j <= n; j++)
        {
                cout << g[i][j] << " ";
        }
        cout << endl;
    }


    return 0;
}

2024/12/26 13:32
加载中...