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 }