dfs | 洛谷 | P1101
阿新 • • 發佈:2019-01-14
https://www.luogu.org/problemnew/show/P1101
- 用二重迴圈構造一個八連通增量
- 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;
}