1. 程式人生 > 實用技巧 >題解 CF60B 【Serial Time!】

題解 CF60B 【Serial Time!】

思路:暴力搜尋


就和大多數迷宮類問題相似,只不過這個是三維的。

眾所周知,迷宮問題的基本搜尋形式就是標記當前點已走過,然後從當前點向能夠擴充套件到的點遞迴。二維迷宮就是\(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;
}