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

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

新規登録して質問してみよう
ただいま回答率
85.35%
再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

C++

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

Q&A

解決済

1回答

1535閲覧

DFS(再帰関数)が正常に作動しない   AtCoder Regular Contest 031-B 埋め立て

alice4649

総合スコア17

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

C++

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

0グッド

0クリップ

投稿2021/08/15 17:18

ARC31-B(https://atcoder.jp/contests/arc031/tasks/arc031_2)でDFSを用いて実装したところ例1が作動しない。ほかの例は正常に作動。内部だと7(33中)がWA。どこが原因なのかわからないのでご教授願いたい。

  • 方針

1.任意のスタートを〇から一つ決める
2.dfsの準備(×をTRUE、〇をFALSE)をしたものを2個用意(A、Bと名付ける)
3.Aを用いてdfs
4.3した時点でたどり着けなかったところ(FALSE)を記録
5.Bを用いてdfs(5では一度TRUEを進んでもOK)
6,4で記録した座標が5をしたらTRUEになったか調べる
7.6ですべてにおいてTRUEだったら”YES”

C++

1#include <bits/stdc++.h> 2using namespace std; 3#define ll long long 4#define rep(i,n) for(ll i=0;i<(n);++i) 5#define pu(n) push_back(n) 6#define INF 1000000000000 //10^12 7/*-------------------------------------------------------------*/ 8vector<vector<bool>>g(10,vector<bool>(10,false));ll gx,gy;ll sx,sy; 9vector<vector<bool>>G(10,vector<bool>(10,false)); 10vector<ll>dx={0,1,0,-1};vector<ll>dy={1,0,-1,0}; 11void dfs(ll a,ll b){// 3 12 if(g[a][b])return; 13 g[a][b]=true; 14 rep(i,4){ 15 if(b==0 and i==2)continue;//全方位 16 if(a==9 and i==1)continue; 17 if(b==9 and i==0)continue; 18 if(a==0 and i==3)continue; 19 dfs(a+dx[i],b+dy[i]); 20 } 21} 22void Dfs(ll a,ll b,ll cnt){//5 23 if(G[a][b] and cnt>0)return;//一度までTRUE踏んでOKだよ~ 24 if(G[a][b])cnt++;      //cntで何回TRUE踏んだか計測 25 G[a][b]=true; 26 rep(i,4){ 27 if(b==0 and i==2)continue;//全方位 28 if(a==9 and i==1)continue; 29 if(b==9 and i==0)continue; 30 if(a==0 and i==3)continue; 31 Dfs(a+dx[i],b+dy[i],cnt); 32 } 33} 34int main(){ 35 rep(i,10){//入力 36 rep(j,10){ 37 char c;cin>>c; 38 if(c=='x'){g[i][j]=true;G[i][j]=true;}//2 39 if(c=='o'){sx=i;sy=j;} //1 40 } 41 } 42 43 dfs(sx,sy);//3 44 45 bool m=true; 46 vector<ll>nx,ny;//4 47 rep(i,10){ 48 rep(j,10){ 49 if(g[i][j]==false){ 50 m=false; 51 nx.pu(i);ny.pu(j); 52 53 } 54 } 55 } 56 if(m){ 57 cout<<"YES"<<endl;return 0;//もしたどり着けなかったところなかったら 58 } 59 60 Dfs(sx,sy,0);//5 61 62 bool mi=true; 63 rep(i,nx.size()){ 64 if(G[nx[i]][ny[i]]==false)mi=false;//6 65 } 66 67 if(mi)cout<<"YES"<<endl;//7 68 else cout<<"NO"<<endl; 69 return 0; 70} 71

一度これ↓を使って図に書きだしたが、どうやら全方位探索できてないようだった(例1)。

C++

1void Dfs(ll a,ll b,ll cnt){ 2 if(G[a][b] and cnt>0)return; 3 if(G[a][b])cnt++; 4 G[a][b]=true; 5 /*rep(i,10){ 6 rep(j,10){ 7 if(i==a and j==b){ 8 cout<<'!'; 9 } 10 if(G[i][j])cout<<'a'; 11 else cout<<'b'; 12 }cout<<endl; 13 }cout<<endl;*/ 14 rep(i,4){ 15 if(b==0 and i==2)continue; 16 if(a==9 and i==1)continue; 17 if(b==9 and i==0)continue; 18 if(a==0 and i==3)continue; 19 Dfs(a+dx[i],b+dy[i],cnt); 20 } 21}

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

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

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

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

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

guest

回答1

0

ベストアンサー

正直なところ、かなり大きな修正が必要になると思われます。
とりあえず、以下の入力でデバッグしてみてください(正しい出力はNO)。

text

1xxxxxxxxxx 2xxxxxxxxxx 3xxxxxxxxxx 4xxxxxxxxxx 5xxxxxxxxxx 6xxxxxxxxxx 7xxxxxxxxxx 8xxxxxxxxxo 9xxxxxxxxxx 10xxxxxxxoxo

投稿2021/08/16 01:12

actorbug

総合スコア2433

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

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

alice4649

2021/08/16 04:30

actorbugさんのtextでこの解き方の問題点もわかりました。ありがとうございます!(dfsあまりやったことなくて・・・。でも一夜明けたら解き方思いつきました。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問