質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1936閲覧

AtCoder の問題を解いたのですがsegmentation faultの原因がわかりません。

PINE1103

総合スコア20

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/08/20 06:55

https://atcoder.jp/contests/agc033/tasks/agc033_a
にある問題を解こうとしたのですが以下のコードを実行するとsegmentation fault
となりました。原因が分かれば教えていただきたいです。

c++

1#include <bits/stdc++.h> 2using namespace std; 3typedef long long ll; 4typedef long double ld; 5typedef pair<int, int> P; 6const ll mod = 1000000007; 7const ll INF = 1e+14; 8#define rep(i,n) for(int i=0;i<n;i++) 9#define per(i,n) for(int i=n-1;i>=0;i--) 10#define Rep(i,sta,n) for(int i=sta;i<n;i++) 11#define rep1(i,n) for(int i=1;i<=n;i++) 12#define per1(i,n) for(int i=n;i>=1;i--) 13#define Rep1(i,sta,n) for(int i=sta;i<=n;i++) 14#define _GLIBCXX_DEBUG 15 16int main(){ 17 int h,w; cin>>h>>w; 18 vector<string> field(h); 19 rep(i,h){ 20 cin>>field[i]; 21 } 22 23 ll dist1[1010][1010]; 24 rep(i,1010){ 25 rep(j,1010){ 26 dist1[i][j]=INF; 27 } 28 } 29 30 rep(i,h){ 31 rep(j,w){ 32 if(field[i][j]=='.') continue; 33 else { 34 ll dist[1010][1010]; 35 rep(k,1010){ 36 rep(l,1010){ 37 dist[k][l]=INF; 38 } 39 } 40 queue<P> que; 41 //初期条件 42 dist[i][j]=0; 43 que.push({i,j}); 44 int dx[4]={-1,1,0,0}; 45 int dy[4]={0,0,-1,1}; 46 while (que.empty()){ 47 P v=que.front(); 48 que.pop(); 49 rep(k,4){ 50 int nh=i+dx[k]; 51 int nw=j+dy[k]; 52 if(nh<0||nh>=h||nw<0||nw>=w) continue; 53 if(dist[nh][nw]!=INF) continue; 54 if(field[nh][nw]=='#') continue; 55 dist[nh][nw]=dist[v.first][v.second]+1; 56 dist1[nh][nw]=min(dist1[nh][nw],dist[nh][nw]); 57 que.push({nh,nw}); 58 } 59 60 } 61 62 } 63 } 64 } 65 66 ll ans=0; 67 rep(i,h){ 68 rep(j,w){ 69 if(dist1[i][j]==INF) continue; 70 else{ 71 ans=max(ans,dist1[i][j]); 72 } 73 } 74 } 75 cout<<ans<<endl; 76 77 78 79}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

配列が確保できないんでしょう。
C++なら基本的にvectorを使ったほうが安全です

投稿2020/08/20 10:34

yudedako67

総合スコア2047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mjk

2020/08/20 12:55

自分も制約でもなければvector1択だと思います。 静的配列をローカル宣言してsegmentation faultが出る解決策は、 vectorを使うか静的配列をグローバル宣言することです。 https://teratail.com/questions/285169
PINE1103

2020/08/20 13:45

なるほど、メモリ的にvectorを使った方が安全なのですね。 ご指摘ありがとうございました。
guest

0

今どきのC/C++で、スタック領域はデフォルトだと1~2MBしか確保されないはずです。
で、ローカル変数はスタック領域にとられます。

さて。

ll dist1[1010][1010];

なんてのがどれだけメモリを消費するか考えてみて下さい。

投稿2020/08/20 12:22

編集2020/08/20 12:23
thkana

総合スコア7629

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

PINE1103

2020/08/20 13:44

なるほど、メモリを消費しすぎていたのですね。 ご指摘ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問