#32927: C++ NA50% 有一些資測還記憶體錯誤


e002933 (徐MAN)

學校 : 不指定學校
編號 : 158405
來源 : [111.71.113.217]
最後登入時間 :
2023-11-18 16:56:51
g276. 2. 魔王迷宮 -- 2021年9月APCS | From: [118.150.201.99] | 發表日期 : 2022-11-17 22:37

各位版友好:

以下附上我的程式碼:

#include<iostream>
using namespace std;

int main() {
    int n, m, k;
    cin>>n>>m>>k;
    int chess[n][m]; 
    for(int p = 0; p < n; p++)
        for(int q = 0; q < m; q++)
            chess[p][q] = 0;        //0表示沒炸彈,1表示有炸彈,2表示同時有魔王跟炸彈
    int walk[k][4];    //用來記錄每個魔王的x,y坐標及x移動,y移動
    bool exit[k] = {0};    //有K個魔王,預設魔王如果還在為0, 魔王如果消失為1
    for(int i = 0; i < k; i++)
        cin>>walk[i][0]>>walk[i][1]>>walk[i][2]>>walk[i][3];
    int devil = k;
    while(devil > 0) {
        for(int i = 0; i < k; i++)
            if(exit[i] == 0)
                chess[walk[i][0]][walk[i][1]] = 1;  //魔王在的格子設為1,表示有炸彈
        for(int i = 0; i < k; i++) {
            walk[i][0]+=walk[i][2];
            walk[i][1]+=walk[i][3];
        }           //魔王移動
        for(int i = 0; i < k; i++) {
            if(exit[i] == 0 && (walk[i][0] >= n || walk[i][1] >= m)) {
                devil--;
                exit[i] = 1;
            }                //魔王出格消失
            if(exit[i] == 0) {
                if(chess[walk[i][0]][walk[i][1]] == 1 || chess[walk[i][0]][walk[i][1]] == 2 ) {
                    devil--;
                    exit[i] = 1;
                    chess[walk[i][0]][walk[i][1]] = 2;
                }          //魔王踩到炸彈,該格上同時有炸彈和魔王(可能不只一個魔王或炸彈),此時設為2
            }
        }
        for(int p = 0; p < n; p++)
            for(int q = 0; q < m; q++)
                if(chess[p][q] == 2)
                    chess[p][q] = 0;             //原本為2的格子,因魔王數在前面已減去,且炸彈也跟著消失,所以將之變回0

    }
    int ans = 0;
    for(int p = 0; p < n; p++)
        for(int q = 0; q < m; q++)
            if(chess[p][q] == 1)
                ans++;
    cout<<ans;
    return 0;
}

 
#32966: Re: C++ NA50% 有一些資測還記憶體錯誤


cges30901 (cges30901)

學校 : 不指定學校
編號 : 30877
來源 : [39.9.74.255]
最後登入時間 :
2024-10-14 22:20:08
g276. 2. 魔王迷宮 -- 2021年9月APCS | From: [118.231.185.180] | 發表日期 : 2022-11-19 22:20


            if(exit[i] == 0 && (walk[i][0] >= n || walk[i][1] >= m)) {


座標小於0也是超出範圍

 
#33009: Re: C++ NA50% 有一些資測還記憶體錯誤


e002933 (徐MAN)

學校 : 不指定學校
編號 : 158405
來源 : [111.71.113.217]
最後登入時間 :
2023-11-18 16:56:51
g276. 2. 魔王迷宮 -- 2021年9月APCS | From: [118.150.201.99] | 發表日期 : 2022-11-22 17:45


            if(exit[i] == 0 && (walk[i][0] >= n || walk[i][1] >= m)) {


座標小於0也是超出範圍

真是一語驚醒夢中人

多加了小於0的狀況就AC了

謝謝您的回答

 
ZeroJudge Forum