AtCoder の問題を解いたのですがsegmentation faultの原因がわかりません。
解決済
回答 2
投稿
- 評価
- クリップ 0
- VIEW 294
https://atcoder.jp/contests/agc033/tasks/agc033_a
にある問題を解こうとしたのですが以下のコードを実行するとsegmentation fault
となりました。原因が分かれば教えていただきたいです。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> P;
const ll mod = 1000000007;
const ll INF = 1e+14;
#define rep(i,n) for(int i=0;i<n;i++)
#define per(i,n) for(int i=n-1;i>=0;i--)
#define Rep(i,sta,n) for(int i=sta;i<n;i++)
#define rep1(i,n) for(int i=1;i<=n;i++)
#define per1(i,n) for(int i=n;i>=1;i--)
#define Rep1(i,sta,n) for(int i=sta;i<=n;i++)
#define _GLIBCXX_DEBUG
int main(){
int h,w; cin>>h>>w;
vector<string> field(h);
rep(i,h){
cin>>field[i];
}
ll dist1[1010][1010];
rep(i,1010){
rep(j,1010){
dist1[i][j]=INF;
}
}
rep(i,h){
rep(j,w){
if(field[i][j]=='.') continue;
else {
ll dist[1010][1010];
rep(k,1010){
rep(l,1010){
dist[k][l]=INF;
}
}
queue<P> que;
//初期条件
dist[i][j]=0;
que.push({i,j});
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
while (que.empty()){
P v=que.front();
que.pop();
rep(k,4){
int nh=i+dx[k];
int nw=j+dy[k];
if(nh<0||nh>=h||nw<0||nw>=w) continue;
if(dist[nh][nw]!=INF) continue;
if(field[nh][nw]=='#') continue;
dist[nh][nw]=dist[v.first][v.second]+1;
dist1[nh][nw]=min(dist1[nh][nw],dist[nh][nw]);
que.push({nh,nw});
}
}
}
}
}
ll ans=0;
rep(i,h){
rep(j,w){
if(dist1[i][j]==INF) continue;
else{
ans=max(ans,dist1[i][j]);
}
}
}
cout<<ans<<endl;
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
配列が確保できないんでしょう。
C++なら基本的にvectorを使ったほうが安全です
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
今どきのC/C++で、スタック領域はデフォルトだと1~2MBしか確保されないはずです。
で、ローカル変数はスタック領域にとられます。
さて。
ll dist1[1010][1010];
なんてのがどれだけメモリを消費するか考えてみて下さい。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.32%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2020/08/20 21:55
静的配列をローカル宣言してsegmentation faultが出る解決策は、
vectorを使うか静的配列をグローバル宣言することです。
https://teratail.com/questions/285169
2020/08/20 22:45
ご指摘ありがとうございました。