C语言 电子老鼠

电子老鼠闯迷宫

时限:1000ms 内存限制:10000K 总时限:3000ms

描述:

有一只电子老鼠被困在如下图所示的迷宫中。这是一个12*12单元的正方形迷宫,黑色部分表示建筑物,白色部分是路。电子老鼠可以在路上向上、下、左、右行走,每一步走一个格子。现给定一个起点S和一个终点T,求出电子老鼠最少要几步从起点走到终点。

输入:

本题包含一个测例。在测例的第一行有四个由空格分隔的整数,分别表示起点的坐标S(x.y)和终点的坐标T(x,y)。从第二行开始的12行中,每行有12个字符,描述迷宫的情况,其中'X'表示建筑物,'.'表示路.

输出:

输出一个整数,即电子老鼠走出迷宫至少需要的步数。

输入样例:

2 9 11 8 XXXXXXXXXXXX X......X.XXX X.X.XX.....X X.X.XX.XXX.X X.X.....X..X X.XXXXXXXXXX X...X.X....X X.XXX...XXXX X.....X....X XXX.XXXX.X.X XXXXXXX..XXX XXXXXXXXXXXX

输出样例:

28

#include<iostream> #include<queue> using namespace std; queue<int>q; int x1,y1,x2,y2; char map[12][13]; int step[200]; int used[200]={0}; int dr[4]={0,1,0,-1}; int dc[4]={-1,0,1,0}; void readmap(); void init(int s); int bfs(); int canmove(int u,int dire); int move(int u,int dire); int main() { int num,u; cin>>x1>>y1>>x2>>y2; x1--;x2--;y1--;y2--;  u=x1*12+y1; init(u); readmap(); num = bfs(); cout << num << endl; return 0; } int bfs() { int u,v,i; while(!q.empty()) { u = q.front(); q.pop(); for(i = 0;i < 4; i ++) { if(canmove(u,i)) { v = move(u,i); if(v == x2*12+y2) { return (step[u]+1); } else { used[v] = 1; step[v] = step[u]+1; q.push(v); } } } } } int canmove(int u,int dire) { int row,col,r,c; row = u/12; col = u%12; r = row + dr[dire]; c = col + dc[dire]; if(r >= 0 && r < 12 && c >= 0 && c < 12 && map[r][c] =='.'&& used[r*12+c] == 0) { return 1; } else { return 0; } } int move(int u,int dire) { int row,col,r,c,v; row = u/12; col = u%12; r = row + dr[dire]; c = col + dc[dire]; v = r*12 + c; return (v); } void readmap() { int i; for(i=0;i<12;i++) { cin>>map[i]; } } void init(int s) { step[s]=0; used[s]=1; q.push(s); }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值