前提
ここに質問の内容を詳しく書いてください。
(問)
H * Wのマスの盤面がある。その左上端にビショップ(斜めにしか移動できない駒)を置く。そのとき、移動できるマスの数を答えよ。
実現したいこと
この問題を、深さ優先探索を用いて解くことができないかと考え、コードを書きました。しかし、実行すると、 out_of_range: vector というエラーが出てします。
配列の範囲を超えているという内容だと思うのですが、どこが間違いていて、どこを修正すればいいのかわかりません。
ここに実現したいことを箇条書きで書いてください。
- H * Wの配列を用意する。
- 0で初期化しておき、ビショップを置くことができれば値を1に変え、カウンターを1増やす
- 最終的なカウンターの値が、移動できるマスの数にしたい
発生している問題・エラーメッセージ
libc++abi: terminating with uncaught exception of type std::out_of_range: vector terminating with uncaught exception of type std::out_of_range: vector (lldb)
該当のソースコード
c++
1#include <iostream> 2#include <vector> 3#include <math.h> 4#include <algorithm> 5using namespace std; 6 7int H, W; 8vector<vector<int>> v(H, vector<int>(W,0)); 9int counter = 0; 10 11 12void dfs(int x, int y) { 13 //現在地 14 v.at(x).at(y) = 1; 15 16 //移動する方向をループ 17 for (int dx = -1; dx < 1; dx++) { 18 for (int dy = -1; dy < 1; dy++) { 19 //移動した位置をnx,nyとする 20 int nx = x + dx, ny = y + dy; 21 if(x + y == nx + ny && 0 <= nx < H && 0 <= ny < W && v.at(nx).at(ny) == 0) { 22 counter++; 23 dfs(nx, ny); 24 } 25 else if(x - y == nx - ny && 0 <= nx < H && 0 <= ny < W && v.at(nx).at(ny) == 0) { 26 counter++; 27 dfs(nx, ny); 28 } 29 } 30 31 } 32} 33 34int main() { 35 cin >> H >> W; 36 v.at(0).at(0) = 1; 37 38 for (int i = 0; i < H; i++) { 39 for (int j = 0; j < W; j++) { 40 if(v.at(i).at(j) == 1){ 41 dfs(i,j); 42 } 43 } 44 } 45 46 cout << counter << endl; 47}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/01/15 09:39 編集
2023/01/15 10:11
2023/01/16 09:44