- 方針
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}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/16 04:30