A. 走迷宫1
走迷宫是很有趣的一种游戏,能够锻炼人的记忆力和思维.现在,HK被困在一个迷宫里面了,请你帮助他找到一条最短的路径,能够让他走出迷宫.
迷宫使用一个N*M的矩阵来描述,矩阵中用'.'代表空格可以通行,用'*'代表障碍物,用'S'代表出发点,用'T'代表出口.例如下面的一个矩阵就描述了一个8*8的迷宫
.....T..
..*****.
......*.
*.***.*.
......*.
.****.*.
S..*....
........
每个字符代表1个格子,HK只能在格子间按上下左右的方向移动
Input
每个输入文件只包含一组输入数据.
每组数据第一行是两个正整数N和M(N,M<=100).
接着是一个N*M的矩阵.
Output
如果HK能够走出迷宫,输出最少需要的步数;否则输出-1.
Sample Input
8 8 .....T.. ..*****. ......*. *.***.*. ......*. .****.*. S..*.... ........
Sample Output
11
题目链接:http://acm.bnu.edu.cn/bnuoj/contest_show.php?cid=841#problem/0
代码:
#include<iostream>
using namespace std;
int a,b,c,d,m,n;
char map[102][102];
int step[102][102];
int main()
{
cin>>m>>n;
int i=0,j=0;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
step[i][j]=-1;
cin>>map[i][j];
if(map[i][j]=='S')
{
a=i;
b=j;
}
if(map[i][j]=='T')
{
c=i;
d=j;
}
}
step[a][b]=1;
if(map[a][b+1]!='*') step[a][b+1]=1;
if(map[a-1][b]!='*') step[a-1][b]=1;
for(i=a;i>=c;i--)
for(j=b;j<=d;j++)
{
if(i==a&&j>=b+1&&map[i][j]!='*'&&step[i][j-1]!=-1)
{
step[i][j]=step[i][j-1];
}
else if(j==b&&i<=a-1&&map[i][j]!='*'&&step[i+1][j]!=-1)
{
step[i][j]=step[i+1][j];
}
else if(i!=a&&j!=b&&map[i][j]!='*')
{
if(step[i+1][j]==-1&&step[i][j-1]==-1) continue;
else if(step[i+1][j]==-1) step[i][j]=step[i][j-1];
else if(step[i][j-1]==-1) step[i][j]=step[i+1][j];
else step[i][j]=(step[i+1][j]+step[i][j-1])08;
}
}
if(step[c][d]!=-1)
cout<<step[c][d]08<<endl;
else cout<<0<<endl;
return 0;
}
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<queue> using namespace std; typedef struct { char c; int x,y; int time; }move; move mo[105][105]; int visit[105][105],flag,flag1; bool judge(move p,int m,int n) { flag1 = 0; if(p.x>0) { if(mo[p.x - 1][p.y].c=='T') flag1 = 1; } if(p.x < n - 1) { if(mo[p.x + 1][p.y].c=='T') flag1 = 1; } if(p.y>0) { if(mo[p.x][p.y - 1].c=='T') flag1 = 1; } if(p.y < m - 1) { if(mo[p.x][p.y + 1].c=='T') flag1 = 1; } if(flag1 == 1) return true; else return false; } bool live(move p,int m,int n) { flag = 0; if(p.x>0) { if(mo[p.x - 1][p.y].c!='*') { flag = 1; } } if(p.x < n - 1) { if(mo[p.x + 1][p.y].c!='*') { flag = 1; } } if(p.y>0) { if(mo[p.x][p.y - 1].c!='*') { flag = 1; } } if(p.y < m - 1) { if(mo[p.x][p.y + 1].c!='*') { flag = 1; } } if(flag == 1) return true; else return false; } int main() { int m,n,i,j,l,k; queue<move>q; move p; while(scanf("%d %d" ,&n ,&m)!=EOF) { getchar(); while(q.empty()==false) q.pop(); memset(visit,0,sizeof(visit)); for(i = 0;i < n;i++) { for(j = 0;j < m;j++) { scanf("%c",&mo[i][j].c); mo[i][j].x = i; mo[i][j].y = j; if(mo[i][j].c=='S') { l = i; k = j; } } getchar(); } q.push(mo[l][k]); p = q.front(); q.pop(); while(true) { if(judge(p,m,n) == true) break; if(live(p,m,n) == true) { if(p.x+1<n&&visit[p.x+1][p.y] == 0&&mo[p.x + 1][p.y].c=='.') { mo[p.x+1][p.y].time = p.time+1; q.push(mo[p.x+1][p.y]); visit[p.x+1][p.y] = 1; } if(p.x - 1 >= 0&&visit[p.x - 1][p.y] == 0&&mo[p.x - 1][p.y].c == '.') { mo[p.x - 1][p.y].time = p.time+1; q.push(mo[p.x - 1][p.y]); visit[p.x - 1][p.y] = 1; } if(p.y + 1<m&&visit[p.x][p.y + 1] == 0&&mo[p.x][p.y + 1].c=='.') { mo[p.x][p.y + 1].time = p.time+1; q.push(mo[p.x][p.y + 1]); visit[p.x][p.y + 1] = 1; } if(p.y - 1>=0&&visit[p.x][p.y - 1] == 0&&mo[p.x][p.y - 1].c=='.') { mo[p.x][p.y - 1].time = p.time+1; q.push(mo[p.x][p.y - 1]); visit[p.x][p.y - 1] = 1; } } if(q.empty() == false ) { p = q.front(); q.pop(); flag = 1; } else { flag = 0; break; } } if(flag == 1) printf("%d\n",p.time + 1); else printf("-1\n"); } return 0; }
还是贴一下海潮哥的代码吧,他的看着比较顺眼而且一般比较简洁。
#include<stdio.h> #include<string.h> struct Node{ int x,y; Node(int a=0,int b=0){x=a,y=b;} }que[10100]; int n,m; const int fx[]={1,-1,0,0}; const int fy[]={0,0,1,-1}; char mp[102][102]; int vis[102][102]; int bfs(){ int s,t,i,j,x,y,nx,ny; memset(vis,-1,sizeof(vis)); for(i=0;i<n;i++){ scanf("%s",mp[i]); for(j=0;j<m;j++) if(mp[i][j]=='S') x=i,y=j; } que[s=t=0]=Node(x,y); vis[x][y]=0; while(s<=t){ x=que[s].x; y=que[s].y; if(mp[x][y]=='T') return vis[x][y]; s++; for(i=0;i<4;i++){ nx=x+fx[i]; ny=y+fy[i]; if(nx<0 || nx>=n || ny<0 || ny>=m) continue; if(mp[nx][ny]=='*' || vis[nx][ny]!=-1) continue; vis[nx][ny]=vis[x][y]+1; que[++t]=Node(nx,ny); } } return -1; } int main(){ while(~scanf("%d%d",&n,&m)) printf("%d\n",bfs()); return 0; }