P1605 迷宫
其实这道题很简单本蒟蒻就是想不到(大佬tql)
思路就是 首先在地图中找到y 然后找i 记录下y->i的方向 然后dfs(方向已经定下来了 用if嵌套dfs即可)
代码
#include<iostream>
#include<string>
#define maxv 1000
using namespace std;
struct node{
int m;
int n;
}a[maxv];//记录地图中符合要求的点 如果记录成功才进行标记
string flect="yizhong";//用于判断
int vis[maxv][maxv];//标记数组 用于输出
char G[maxv][maxv];//存图
int dir[][2]={
{
1,1},{
1,0},{
0,1},{
-1,-1},{
1,-1},{
-1,1},{
-1,0},{
0,-1}};//8个方向
void dfs(int x,int y,int fx,int num){
if(num==6){
for(int i=0;i<7;i++){
vis[a[i].m][a[i].n]=1;
}
}
if(G[x+dir[fx][0]][y+dir[fx][1]]==flect[num+1]){
if(flect[num+1]=='g'){
//因为存入的是上一个的位置 所以在这里要特殊判断下
a[num+1].m=x+dir[fx][0];
a[num+1].n=y+dir[fx][1];
}
a[num].m=x;//记录位置 用于完成后的标记
a[num].n=y;
dfs(x+dir[fx][0],y+dir[fx][1],fx,num+1);
}
}
int main() {
for(int i=0;i<maxv;i++){
for(int j=0;j<maxv;j++){
G[i][j]='-';
vis[i][j]=0;
}
}//初始化
int n;
cin>>n;
char c;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>c;
G[i][j]=c;//读入图
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(G[i][j]=='y'){
//当找到y时进行下一步的找i
for(int ii=0;ii<8;ii++)
{
if(G[i+dir[ii][0]][j+dir[ii][1]]=='i'){
//如果找到i 确定好了方向进行dfs
dfs(i,j,ii,0);
}
}
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(vis[i][j]==1){
//如果被标记了就输出原图
cout<<G[i][j];
}
else
cout<<'*';//否则输出*
}
cout<<endl;//注意换行
}
return 0;
}