A - 逃离迷宫 DFS

 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,gloria不能走到迷宫外面去。令人头痛的是,gloria是个没什么方向感的人,因此,她在行走过程中,不能转太多弯了,否则她会晕倒的。我们假定给定的两个位置都是空地,初始时,gloria所面向的方向未定,她可以选择4个方向的任何一个出发,而不算成一次转弯。gloria能从一个位置走到另外一个位置吗?

Input

  第1行为一个整数t (1 ≤ t ≤ 100),表示测试数据的个数,接下来为t组测试数据,每组测试数据中, 
  第1行为两个整数m, n (1 ≤ m, n ≤ 100),分别表示迷宫的行数和列数,接下来m行,每行包括n个字符,其中字符'.'表示该位置为空地,字符'*'表示该位置为障碍,输入数据中只有这两种字符,每组测试数据的最后一行为5个整数k, x 1, y 1, x 2, y 2 (1 ≤ k ≤ 10, 1 ≤ x 1, x 2 ≤ n, 1 ≤ y 1, y 2 ≤ m),其中k表示gloria最多能转的弯数,(x 1, y 1), (x2, y 2)表示两个位置,其中x 1,x 2对应列,y 1, y 2对应行。 

Output

  每组测试数据对应为一行,若gloria能从一个位置走到另外一个位置,输出“yes”,否则输出“no”。

Sample Input

2
5 5
...**
*.**.
.....
.....
*....
1 1 1 1 3
5 5
...**
*.**.
.....
.....
*....
2 1 1 1 3

Sample Output

no
yes

思路:思路是选好一个方向后就直沿着这个方向往前搜索,直到到边界或者碰到墙,中间如果这个点没有搜过把它入队列,如果搜过了我们直接跳过这个点搜下一个,因为走到这个点时之前的方向是有多个的所以可以重复走,因为之前搜过了所以没必要再重新入队列。、

注意:此题的输入是第一个数是转向的次数,后面是开始和结束的 列和行,这是和我们的习惯相反的,比较坑。

代码:

  1. #include<queue>
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<algorithm>
  5. using namespace std;
  6. char s[110][110];
  7. int book[110][110];
  8. int n,m,k,ex,ey,sx,sy,zh,flag;
  9. int to[4][2]= {0,1,1,0,0,-1,-1,0};
  10. struct note
  11. {
  12.     int x,y,cen;
  13. };
  14. void bfs(int x,int y)
  15. {
  16.     queue<note> q;
  17.     note st,en;
  18.     st.x=x;
  19.     st.y=y;
  20.     st.cen=-1;
  21.     q.push(st);
  22.     while(!q.empty())
  23.     {
  24.         st=q.front();
  25.         q.pop();
  26.         if(st.cen>=zh) return;
  27.         for(int i=0; i<4; i++)
  28.         {
  29.              en.x=st.x+to[i][0];
  30.              en.y =st.y+to[i][1];
  31.              en.cen=st.cen+1;
  32.             while(1)
  33.             {
  34.                 if(en.x<0||en.x>=n||en.y<0||en.y>=m||s[en.x][en.y]=='*')//判断前面还能走吗,
  35.                     break;
  36.                 if(en.x==ex && en.y==ey) //找到终点
  37.                 {   flag=1;
  38.                     printf("yes\n");
  39.                     return;
  40.                 }
  41.                 if(book[en.x][en.y]==0) //没艘过入队列                {
  42.                     book[en.x][en.y]=1;
  43.                     q.push(en);
  44.                 }
  45.                 en.x+=to[i][0];      //接着搜下一个
  46.                 en.y+=to[i][1];
  47.             }
  48.         }
  49.     }
  50. }
  51. int main()
  52. {
  53.     int N;
  54.     scanf("%d",&N);
  55.     while(N--)
  56.     {
  57.         scanf("%d%d",&n,&m);
  58.         memset(book,0,sizeof(book));
  59.         getchar();
  60.         for(int i=0; i<n; i++)
  61.             scanf("%s",s[i]);
  62.         scanf("%d%d%d%d%d",&zh,&sy,&sx,&ey,&ex);//输入要注意
  63.         sx--;
  64.         sy--;
  65.         ex--;
  66.         ey--;
  67.         if(sx==ex&&sy==ey)
  68.         {
  69.             printf("yes\n");
  70.             continue;
  71.         }
  72.         flag=0;
  73.         book[sx][sy]=1;
  74.         bfs(sx,sy);
  75.         
  76.         if(flag==0)
  77.             printf("no\n");
  78.     }
  79.     return 0;
  80. }
     

猜你喜欢

转载自blog.csdn.net/TANG3223/article/details/81192462