AOJの「迷図と命ず」をc++で回答しているのですが、「Memory limit exceeded」エラーが発生してしまいます。通常の幅優先探索と比べて大きな配列を使っているわけではないと思うのですが、原因お分かりの方いれば教えていただきたいです。
#include <bits/stdc++.h> using namespace std; vector<vector<int>> WallVertical; vector<vector<int>> WallHorizon; vector<vector<int>> seen; int main() { while(true){ int w,h; cin >> w >> h; if(w == 0 && h == 0)break; vector<int> temp1(w-1,0); WallVertical.assign(h,temp1); vector<int> temp2(w,0); WallHorizon.assign(h-1,temp2); for(int i = 0; i < h; i++){ for(int j = 0; j < w-1; j++){ cin>>WallVertical.at(i).at(j); } if(i == h-1)break; for(int j = 0; j < w; j++){ cin>>WallHorizon.at(i).at(j); } } vector<int> temp3(w,-1); seen.assign(h,temp3); vector<pair<int,int>> nextWatch = {make_pair(0,0)}; int counter = 1; while(nextWatch.size()){ vector<pair<int,int>> nextWatch_temp; for(auto pixel : nextWatch){ seen.at(pixel.first).at(pixel.second) = counter; int x,y; bool flag; x = pixel.first-1; y = pixel.second; flag = true; if(x < 0 || x >= h)flag = false; if(y < 0 || y >= w)flag = false; if(flag){ // cout << "aaaa" << endl; if(seen.at(x).at(y) == -1 && !(WallHorizon.at(x).at(y))){ nextWatch_temp.push_back(make_pair(x,y)); } } x = pixel.first+1; y = pixel.second; flag = true; if(x < 0 || x >= h)flag = false; if(y < 0 || y >= w)flag = false; if(flag){ // cout << "bbbb" << endl; if(seen.at(x).at(y) == -1 && !(WallHorizon.at(x-1).at(y))){ nextWatch_temp.push_back(make_pair(x,y)); } } x = pixel.first; y = pixel.second-1; flag = true; if(x < 0 || x >= h)flag = false; if(y < 0 || y >= w)flag = false; if(flag){ // cout << "cccc" << endl; if(seen.at(x).at(y) == -1 && !(WallVertical.at(x).at(y))){ nextWatch_temp.push_back(make_pair(x,y)); } } x = pixel.first; y = pixel.second+1; flag = true; if(x < 0 || x >= h)flag = false; if(y < 0 || y >= w)flag = false; if(flag){ // cout << "dddd" << endl; if(seen.at(x).at(y) == -1 && !(WallVertical.at(x).at(y-1))){ nextWatch_temp.push_back(make_pair(x,y)); } } } nextWatch = nextWatch_temp; counter++; } if(seen.at(h-1).at(w-1) == -1){ cout << 0 << endl; }else{ cout << seen.at(h-1).at(w-1) << endl; } } }
特定ページに載っている問題について質問する際には、そのページのURLも質問に載せてください。
https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1166&lang=jp
URLを載せないと、回答者がわざわざ問題を探さなければならないため、答えてもらえる可能性が低くなります。
回答1件
あなたの回答
tips
プレビュー