您的位置:首页 > 其它

nyoj 58 最小步数

2014-11-19 20:26 197 查看
难度:4

描述
这有一个迷宫,有0~8行和0~8列:

1,1,1,1,1,1,1,1,1

1,0,0,1,0,0,1,0,1

1,0,0,1,1,0,0,0,1

1,0,1,0,1,1,0,1,1

1,0,0,0,0,1,0,0,1

1,1,0,1,0,1,0,0,1

1,1,0,1,0,1,0,0,1

1,1,0,1,0,0,0,0,1

1,1,1,1,1,1,1,1,1

0表示道路,1表示墙。

现在输入一个道路的坐标作为起点,再如输入一个道路的坐标作为终点,问最少走几步才能从起点到达终点?

(注:一步是指从一坐标点走到其上下左右相邻坐标点,如:从(3,1)到(4,1)。)

输入第一行输入一个整数n(0<n<=100),表示有n组测试数据;

随后n行,每行有四个整数a,b,c,d(0<=a,b,c,d<=8)分别表示起点的行、列,终点的行、列。输出输出最少走几步。样例输入
2
3 1  5 7
3 1  6 7

样例输出
12
11


#include<stdio.h>
#include<queue>//队列头文件
using namespace std;
int d[4][2]={-1,0,0,1,1,0,0,-1}; //搜索方向
struct point
{
int x,y,step;
};

int bfs(point s,point t,int map[9][9])
{
queue<point> que;//建立队列
int i;
point p;  //临时中间变量
que.push(s);       //真心不知道注释出为什么是不对的,就是不能AC
//	 while(1)
//	 {
//	 	 if(s.x==t.x&&s.y==t.y) //找到位置
//		    return s.step;
//		 for(i=0;i<4;++i)
//		  {
//		  	  p.x=s.x+d[i][0];
//			  p.y=s.y+d[i][1];
////			  if(p.x<0||p.x>8||p.y<0||p.y>8)  //超出临界
////			     continue;  //继续走
//			 if(map[p.x][p.y]==0) //此路可走
//			  {
//			  	map[p.x][p.y]==1; //走过标记
//				p.step=s.step+1;//增加步数
//				que.push(p)  ;//位置入队
//			  }
//
//		  }
//		    s=que.front();//继续搜索
//			que.pop();// 并且出队
//	 }
while(1)
{
if(s.x==t.x&&s.y==t.y)
return s.step;
for(i=0;i<4;++i)
{
p.x=s.x+d[i][0];
p.y=s.y+d[i][1];
if(map[p.x][p.y]==0)
{
p.step=s.step+1;
map[p.x][p.y]=1;
que.push(p);
}
}
s=que.front();
que.pop();

}

}

int main()
{
int T;
point start ,end;//定义结构体开始位置及末位置
scanf("%d",&T);
while(T--)
{
int  map[9][9]={
1,1,1,1,1,1,1,1,1,
1,0,0,1,0,0,1,0,1,
1,0,0,1,1,0,0,0,1,
1,0,1,0,1,1,0,1,1,
1,0,0,0,0,1,0,0,1,
1,1,0,1,0,1,0,0,1,
1,1,0,1,0,1,0,0,1,
1,1,0,1,0,0,0,0,1,
1,1,1,1,1,1,1,1,1,
};
scanf("%d%d%d%d",&start.x,&start.y,&end.x,&end.y);
map[start.x][start.y]=1;
start.step=0;
printf("%d\n",bfs(start,end,map));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: