DFS的例题,难点在于所选的yizhong必须是一行的不能拐弯,我第一次写的时候直接在DFS里的判断条件里加了if(当前位置的字符==yizhong相应位置的字符)这样的语句,当然这样不对,因为没有保证拐弯的问题。怎样去保证不拐弯呢,只需要定义一个八向的二维数组,然后寻找到y的时候再去找i找到i就把这个k传入进DFS以后方向就是这个k。因为已经定好了方向所以不用担心越界重复等问题,如果有问题直接return不会在相应的记录状态数组上记录。还有的问题就是要用char的二维数组我不知道为什么用string一个for一直错,让我还以为是算法错了
经过试验发现数组可以保证有负数的下标而不终止程序,string不能忍受,所以在最开始的时候用string就会出现负数的下标
代码 (算法借鉴)
#include <bits/stdc++.h>
using namespace std;
int bk[110][110];
char st[110][110];
int dir[][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
char yz[]="yizhong";
struct node
{
int x,y;
}p[110];
void dfs(int x,int y,int id,int k)
{
if(id==7)
{
for(int i=0;i<7;i++)
bk[p[i].x][p[i].y]=1;
}
else
{
int xx=x+dir[k][0];
int yy=y+dir[k][1];
if(id==6||st[xx][yy]==yz[id+1])
{
p[id].x=x;p[id].y=y;
dfs(xx,yy,id+1,k);
}
}
}
main()
{
//freopen("data.in","r",stdin);
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>st[i];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(st[i][j]=='y')
{
for(int k=0;k<8;k++)
{
int x=i+dir[k][0];
int y=j+dir[k][1];
if(st[x][y]=='i')
dfs(i,j,0,k);
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(bk[i][j])
cout<<st[i][j];
else
cout<<"*";
}
cout<<endl;
}
}