Basic Wall Maze

poj2935:http://poj.org/problem?id=2935

题意:在6*6的格子中,有一些,如果两个格子之间有墙的话,就不能直接相通,问最少要经过几步才能从起点走到终点。并且输出路径。

题解:直接bfs

  1 #include<iostream>
  2 #include<cstring>
  3 #include<cstdio>
  4 #include<algorithm>
  5 #include<queue>
  6 using namespace std;
  7 struct Node{
  8   int sal;
  9   char path[50];
 10 
 11 }; //用来记录当前节点的到起点的最小值以及取得这个最小值所对应的路径
 12 int sx ,sy,dx,dy;//记录起点和终点坐标
 13 Node  mit[8][8];
 14 struct Node1{
 15  int x;
 16  int y;
 17  int step;
 18 };//记录当前节点的坐标和对应的步数
 19 struct point{
 20   int up,down,left,right;
 21 
 22 }; //记录该节点的上下左右是否有墙壁
 23 point map[7][7];
 24 Node bfs(){
 25    queue<Node1>Q;
 26      Node1 temp;
 27      temp.x=sx;
 28      temp.y=sy;
 29      temp.step=0;
 30      Q.push(temp);
 31      while(!Q.empty()){
 32        Node1 tmp;
 33        tmp=Q.front();
 34        Q.pop();
 35         int xx=tmp.x;
 36         int yy=tmp.y;
 37        if(yy>=2&&map[xx][yy].up==0&&tmp.step+1<mit[xx][yy-1].sal){//向周围四个方向收索,满足条件就放进队列
 38           Node1 tt;
 39           tt.x=xx;
 40           tt.y=yy-1;
 41           tt.step=tmp.step+1;
 42              mit[xx][yy-1].sal=tmp.step+1;
 43              for(int i=1;i<=mit[xx][yy].sal;i++){
 44                  mit[xx][yy-1].path[i]=mit[xx][yy].path[i];
 45              }
 46              mit[xx][yy-1].path[mit[xx][yy-1].sal]='N'; //这里是把更新当前节点的路径
 47              Q.push(tt);                                 //通过复制前一步的路径,以及加上这一步的路径来实现
 48        }
 49        if(yy<6&&map[xx][yy].down==0&&tmp.step+1<mit[xx][yy+1].sal){
 50            Node1 tt;
 51           tt.x=xx;
 52           tt.y=yy+1;
 53           tt.step=tmp.step+1;
 54              mit[xx][yy+1].sal=tmp.step+1;
 55              for(int i=1;i<=mit[xx][yy].sal;i++){
 56                  mit[xx][yy+1].path[i]=mit[xx][yy].path[i];
 57              }
 58              mit[xx][yy+1].path[mit[xx][yy+1].sal]='S';
 59               Q.push(tt);
 60 
 61        }
 62        
 63        if(xx>=2&&map[xx][yy].left==0&&tmp.step+1<mit[xx-1][yy].sal){
 64            Node1 tt;
 65           tt.x=xx-1;
 66           tt.y=yy;
 67           tt.step=tmp.step+1;
 68              mit[xx-1][yy].sal=tmp.step+1;
 69              for(int i=1;i<=mit[xx][yy].sal;i++){
 70                  mit[xx-1][yy].path[i]=mit[xx][yy].path[i];
 71              }
 72              mit[xx-1][yy].path[mit[xx-1][yy].sal]='W';
 73               Q.push(tt);
 74 
 75        }
 76        if(xx<6&&map[xx][yy].right==0&&tmp.step+1<mit[xx+1][yy].sal){
 77            Node1 tt;
 78           tt.x=xx+1;
 79           tt.y=yy;
 80           tt.step=tmp.step+1;
 81              mit[xx+1][yy].sal=tmp.step+1;
 82              for(int i=1;i<=mit[xx][yy].sal;i++){
 83                  mit[xx+1][yy].path[i]=mit[xx][yy].path[i];
 84              }
 85              mit[xx+1][yy].path[mit[xx+1][yy].sal]='E';
 86               Q.push(tt);
 87        }
 88 
 89 
 90      }
 91     return mit[dx][dy];
 92 
 93 }
 94 
 95 int main(){
 96 
 97 while(~scanf("%d%d",&sx,&sy)){
 98     if(sx==0&&sy==0)break;
 99     scanf("%d%d",&dx,&dy);
100     for(int i=1;i<=6;i++)
101       for(int j=1;j<=6;j++){
102          map[i][j].up=map[i][j].down=map[i][j].left=map[i][j].right=0;
103      } //初始化图
104    for(int i=1;i<=6;i++){
105       map[i][1].up=1;
106       map[i][6].down=1;
107       map[1][i].left=1;
108       map[6][i].right=1;
109      } //这里是对第一行和最后一行以及第一列和最后一列做特殊处理
110      int x1,y1,x2,y2;
111      for(int i=0;i<=2;i++){
112      scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
113      if(x1==x2)//竖的放的(对墙壁的处理)
114        for(int i=y1+1;i<=y2;i++)
115        {  if(x1>0)
116           map[x1][i].right=1;
117           if(x1<6)
118           map[x1+1][i].left=1;
119        }
120        if(y1==y2){ //横着放着
121          for(int i=x1+1;i<=x2;i++){
122              if(y1>0)
123              map[i][y1].down=1;
124              if(y1<6)
125              map[i][y1+1].up=1;
126 
127          }
128          }
129          }
130         for(int i=1;i<=6;i++)
131           for(int j=1;j<=6;j++)
132              mit[i][j].sal=100000000;
133               mit[sx][sy].sal=0;//注意这里的初始化
134       Node ans=bfs();
135       for(int i=1;i<=ans.sal;i++)
136         printf("%c",ans.path[i]);//打出路径
137         printf("
");
138     }
139 }
View Code
原文地址:https://www.cnblogs.com/chujian123/p/3366439.html