給你一個迷宮,
S為起點,E為終點。
請你找出走出迷宮所需要花費的最短步數。
你只能往上下左右四個方向移動。
第一行有一個數字T,代表有T組測資。
每組測資的第一行有兩個數字R、C,
代表迷宮的大小(R x C)。
接下來R行,每行有C個字元來描述迷宮,
'.'代表可以行走的路,
'X'代表不可行走的牆壁,
'S'代表起點,
'E'代表終點。
測資範圍:
T < 100
2 < R,C <= 30
對於每組測資,計算由起點到達終點的最少步數。
測資保證一定存在至少一條由起點通往終點的路徑。
將每組測資的步數加總後再輸出。
输入样例:
2
5 5
SXXXX
...XX
.X...
..XXX
....E
6 6
......
.S..X.
XXX...
....X.
.X..XX
.EX...
输出样例:
18
#include <stdio.h> #include <stdlib.h> #define R 30 /* run this program using the console pauser or add your own getch, system("pause") or input loop */ struct _node{ int level; int x; int y; struct _node* next; }; typedef struct _node Node; struct _queue{ Node* head; Node* tail; int size; }; typedef struct _queue Queue; void enQueue(Queue* que, int x,int y, int level) { Node* p; p = (Node*)malloc(sizeof(Node)); p->x = x; p->y = y; p->level = level; p->next = NULL; if(que->size==0) { que->head = p; que->tail = p; } else { que->tail->next=p; que->tail = p; } que->size+=1; } int short_path(char* array, int start_x, int start_y, int row, int col) { Node *head,*tail,*p,*target; int x,y, level,i,j; char chr; int flag[row][col]; for(i=0;i<row;i++) { for(j=0;j<col;j++) { flag[i][j]=0; } } flag[start_x][start_y]=1; Queue que; que.head = NULL; que.tail = NULL; que.size = 0; enQueue(&que, start_x, start_y, 0); while(que.size>0) { //deqQueue target = que.head; x = target->x; y = target->y; level = target->level; que.head = target->next; que.size -= 1; //chr = *(array+x*col+y); //printf("deQueue x= %d, y= %d, level= %d\n",x,y,level); free(target); // left if((y-1>=0) && (y<col) && (flag[x][y-1]==0)) { chr = *(array+x*col+y-1); //printf("explored left %c, x= %d, y= %d, level= %d\n", chr, x,y-1, level+1); flag[x][y-1]=1; if(chr=='.') { //printf("enqueue x= %d, y= %d, level= %d\n",x,y-1,level+1); enQueue(&que, x,y-1,level+1); } else if(chr=='E') return level+1; } // right if((y+1<col) && (y>=0) && (flag[x][y+1]==0)) { chr = *(array+x*col+y+1); //printf("explored right %c, x= %d, y= %d, level= %d\n", chr, x,y+1, level+1); flag[x][y+1]=1; if(chr=='.') { //printf("enqueue x= %d, y= %d, level= %d\n",x,y+1,level+1); enQueue(&que, x,y+1,level+1); } else if(chr=='E') return level+1; } // up if(x-1>=0 && x<row && (flag[x-1][y]==0)) { chr = *(array+(x-1)*col+y); //printf("explored up %c, x= %d, y= %d, level= %d\n", chr, x-1,y, level+1); flag[x-1][y]=1; if(chr=='.') { //printf("enqueue x= %d, y= %d, level= %d\n",x-1,y,level+1); enQueue(&que, x-1,y,level+1); } else if(chr=='E') return level+1; } // down if(x+1<row && x>=0 && (flag[x+1][y]==0)) { chr = *(array+(x+1)*col+y); //printf("explored down %c, x= %d, y= %d, level= %d\n", chr, x+1,y, level+1); flag[x+1][y]=1; if(chr=='.') { //printf("enqueue x= %d, y= %d, level= %d\n",x+1,y,level+1); enQueue(&que, x+1,y,level+1); } else if(chr=='E') return level+1; } } return -1; } int main() { int m,n,i,j,strt_x,strt_y,test_num,k,sum=0; scanf("%d",&test_num); for(k=0;k<test_num;k++) { scanf("%d %d\n",&m,&n); char array[m][n]; for(i=0;i<m;i++) { gets(array[i]); for(j=0;j<n;j++) { if(array[i][j]=='S') { strt_x=i; strt_y=j; } } } sum += short_path((char*)array, strt_x, strt_y, m, n); } /* array[0][0]='.';array[0][1]='.'; array[0][2]='.';array[0][3]='.';array[0][4]='.';array[0][5]='.'; array[1][0]='.';array[1][1]='S'; array[1][2]='.';array[1][3]='.';array[1][4]='X';array[1][5]='.'; array[2][0]='X';array[2][1]='X'; array[2][2]='X';array[2][3]='.';array[2][4]='.';array[2][5]='.'; array[3][0]='.';array[3][1]='.'; array[3][2]='.';array[3][3]='.';array[3][4]='X';array[3][5]='.'; array[4][0]='.';array[4][1]='X'; array[4][2]='.';array[4][3]='.';array[4][4]='X';array[4][5]='X'; array[5][0]='.';array[5][1]='E'; array[5][2]='X';array[5][3]='.';array[5][4]='.';array[5][5]='.'; strt_x = 1; strt_y = 1; */ /* */ // //printf("x: %d, y= %d\n", strt_x, strt_y); printf("%d",sum); /* for(i=0;i<m;i++) { printf("%c %c %c %c %c\n",array[i][0],array[i][1],array[i][2],array[i][3],array[i][4]); }*/ return 0; }