題解 CF60B 【Serial Time!】
阿新 • • 發佈:2020-08-03
思路:暴力搜尋
就和大多數迷宮類問題相似,只不過這個是三維的。
眾所周知,迷宮問題的基本搜尋形式就是標記當前點已走過,然後從當前點向能夠擴充套件到的點遞迴。二維迷宮就是\(dfs(x\pm1,y),dfs(x,y\pm1)\),三維就在原來基礎上加上\(z\),也就是\(dfs(x\pm1,y,z),dfs(x,y\pm1,z),dfs(x,y,z\pm1)\)。遞迴邊界顯然,就是不出地圖和能走動。
為了方便,我們提前預處理出走的這六步,也就是下面程式碼中的dx[],dy[],dz[]
。
Coding Time
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=15; const int dx[7]={0,1,-1,0,0,0,0},dy[7]={0,0,0,1,-1,0,0},dz[7]={0,0,0,0,0,1,-1};//預處理出走的方向 char ch[N][N][N]; bool vis[N][N][N]; int n,m,k,u,v,t; bool check(int x,int y,int z) { if(x<1||x>n||y<1||y>m||z<1||z>k) return 0;//超出邊界 if(vis[x][y][z]||ch[x][y][z]-'.') return 0;//此路不通 //ch[x][y][z]-'.'等同於ch[x][y][z]!='.' return 1; } void dfs(int x,int y,int z) { ++t;//統計答案 vis[x][y][z]=1;//標記走過 for(int i=1;i<=6;i++) { int xx=x+dx[i],yy=y+dy[i],zz=z+dz[i];//走一步 if(check(xx,yy,zz)) dfs(xx,yy,zz);//可行的話搜尋下一層 } return; } int main() { ios::sync_with_stdio(0); cin.tie(0);//讀入優化 cin>>k>>n>>m; for(int l=1;l<=k;l++) for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>ch[i][j][l];//讀入地圖 cin>>u>>v; dfs(u,v,1);//開始搜尋 cout<<t; return 0; }