1075 - 迷宫问题
时间限制 : 1 秒
内存限制 : 32 MB
小明置身于一个迷宫,请你帮小明找出从起点到终点的最短路程。
小明只能向上下左右四个方向移动。
题目输入
输入包含多组测试数据。输入的第一行是一个整数T,表示有T组测试数据。
每组输入的第一行是两个整数N和M(1<=N,M<=100)。
接下来N行,每行输入M个字符,每个字符表示迷宫中的一个小方格。
字符的含义如下:
‘S’:起点
‘E’:终点
‘-’:空地,可以通过
‘#’:障碍,无法通过
输入数据保证有且仅有一个起点和终点。
题目输出
对于每组输入,输出从起点到终点的最短路程,如果不存在从起点到终点的路,则输出-1。
输入/输出样例
输入格式
1 5 5 S-### ----- ##--- E#--- ---##
输出格式
9
C语言解答
#include<stdio.h> int main(void) { int k,x; scanf("%d",&x); for(k=1;k<=x;k++) {int i,j,m,n,w,i1,i2,i3,j1,j2,j3,f=0,r=1; char mg[105][105]; int zg[105][105],ins[105][105],tx[4]={0,1,0,-1},ty[4]={1,0,-1,0},q[10005]; scanf("%d%d",&n,&m); getchar(); for(i=0;i<n;i++) { for(j=0;j<m;j++) scanf("%c",&mg[i][j]); getchar();} for(i=0;i<n;i++) for(j=0;j<m;j++) { zg[i][j]=0; ins[i][j]=0; if(mg[i][j]=='S') {i1=i;j1=j;} } q[f]=i1*m+j1; zg[i1][j1]=1; while(f<r) {w=q[f]; i2=w/m;j2=w%m; f++; for(i=0;i<4;i++) { i3=i2+tx[i];j3=j2+ty[i]; if(i3>=0&&i3<n&&j3>=0&&j3<m&&(mg[i3][j3]!='#')&&(!zg[i3][j3])) {zg[i3][j3]=1; ins[i3][j3]=ins[i2][j2]+1; q[r]=i3*m+j3; r++; } } } for(i=0;i<n;i++) for(j=0;j<m;j++) if(mg[i][j]=='E') if(ins[i][j]!=0) printf("%d\n",ins[i][j]); else printf("-1\n"); } return 0; }
C++解答
#include<iostream> #include<cstring> #include<queue> using namespace std; struct MAP { int x,y,step; }s,e,head,tail; char g[100][100]; int v[100][100],f[][2]={{-1,0},{0,1},{1,0},{0,-1}},n,m; int bfs() { memset(v,0,sizeof(v)); queue<struct MAP> q; q.push(s); s.step=0; v[s.x][s.y]=1; while(!q.empty()) { head=q.front(); q.pop(); for(int i=0;i<4;i++) { tail.x=head.x+f[i][0]; tail.y=head.y+f[i][1]; tail.step=head.step+1; if(!v[tail.x][tail.y]&&g[tail.x][tail.y]!='#'&&tail.x>=0&&tail.x<n&&tail.y>=0&&tail.y<m) { if(tail.x==e.x&&tail.y==e.y) return tail.step; v[tail.x][tail.y]=1; q.push(tail); } } } return -1; } int main() { int t,i,j; cin>>t; while(t--) { cin>>n>>m; for(i=0;i<n;i++) for(j=0;j<m;j++) { cin>>g[i][j]; if(g[i][j]=='S') { s.x=i; s.y=j; } else if(g[i][j]=='E') { e.x=i; e.y=j; } } cout<<bfs()<<endl; } return 0; }
Java解答
import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class Main { static int m,n; public static void main(String[] args) { Scanner in = new Scanner(System.in); int x = in.nextInt(); for(int ii=0;ii<x;ii++){ m = in.nextInt(); n = in.nextInt(); Node3 s = new Node3(); Node3 e = new Node3(); char[][] maze = new char[m][n]; for(int i=0;i<m;i++){ String str = in.next(); for(int j=0;j<n;j++){ maze[i][j] = str.charAt(j); if(maze[i][j]=='S'){ s.x=i; s.y=j; } else if(maze[i][j]=='E'){ e.x=i; e.y=j; } } } System.out.println(bfs(maze,s,e)); } } public static int bfs(char[][] maze, Node3 s, Node3 e) { int[][] d = { { 0, 1 }, { 0, -1 }, { 1, 0 }, { -1, 0 } }; Queue<Node3> q = new LinkedList<Node3>(); q.add(s); maze[s.x][s.y] = '@'; while (!q.isEmpty()) { Node3 t = q.poll(); for (int i = 0; i < 4; i++) { int xx = t.x + d[i][0]; int yy = t.y + d[i][1]; if (xx == e.x && yy == e.y){ return t.d+1; } } for (int i = 0; i < 4; i++) { int xx = t.x + d[i][0]; int yy = t.y + d[i][1]; if (xx >= 0 && xx < m && yy >= 0 && yy < n && maze[xx][yy] == '-') { maze[xx][yy] = '@'; q.add(new Node3(xx, yy, t.d + 1)); } } } return -1; } } class Node3{ int x,y,d; public Node3(){ d = 0; } public Node3(int a,int b,int c){ x = a; y = b; d = c; } }