1. 程式人生 > >dfs | 洛谷 | P1101

dfs | 洛谷 | P1101

https://www.luogu.org/problemnew/show/P1101

  1. 用二重迴圈構造一個八連通增量
  2. for外夾緊的dfs
#include <bits/stdc++.h>
#define FF(a,b) for(int a=0;a<b;a++)
#define F(a,b) for(int a=1;a<=b;a++)
#define LEN 110
#define bug(x) cout<<#x<<"="<<x<<endl;

using namespace std;

typedef
struct point { int x,y; point(int x=0,int y=0):x(x),y(y){} }point; point pt[LEN]; char word[LEN][LEN]; char stand[]="yizhong"; int vis[LEN][LEN];//儲存路徑 int dir[8][2]; int n; void build_dir() { int k=0; FF(i,3)FF(j,3){ if(i==1 && j==1) continue; dir[k][0]=i-1; dir[
k][1]=j-1; k++; } } bool legal(int x){ if(x>=0 && x<n) return true; else return false; } void dfs(int x,int y,int k,int cur){ if(cur==7){ FF(i,7){ vis[pt[i].x][pt[i].y]=1; } return; } int dx=dir[k][0]; int dy=
dir[k][1]; if(legal(x) && legal(y) && word[x][y]==stand[cur]){ pt[cur]=point(x,y); dfs(x+dx,y+dy,k,cur+1); } } int main() { build_dir(); freopen("./in","r",stdin); scanf("%d",&n); for(int i=0; i<n; i++) scanf("%s",word[i]); FF(i,n)FF(j,n)if(word[i][j]=='y'){ FF(k,8){ int tx=i+dir[k][0]; int ty=j+dir[k][1]; if(word[tx][ty]=='i'){ dfs(i,j,k,0); } } } FF(i,n){ FF(j,n) putchar(vis[i][j]?word[i][j]:'*' ); puts(""); } return 0; }