最少步数

原创 2018年04月17日 15:16:52

描述

这有一个迷宫,有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 <bits/stdc++.h>
using namespace std;
int mmin;
int we[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,  
};  
int zz[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int aa[9][9];
void bfs(int a,int b,int s,int za,int zb){
	if(a==za && b==zb){
		if(mmin>s)
			mmin=s;
			return ;
	}
	for(int i=0;i<4;i++){
		int xx=a+zz[i][0];
		int yy=b+zz[i][1];
		if(xx>=0 && xx<9 && yy>=0 && yy<9 && we[xx][yy]!=1 && aa[xx][yy]!=1){
			aa[xx][yy]=1;
			bfs(xx,yy,s+1,za,zb);
			aa[xx][yy]=0;
		}
	}
	return ;
}
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		mmin=999999;
		int x1,y1,x2,y2;
		scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
		memset(aa,0,sizeof(aa));
		aa[x1][y1]=1;
		bfs(x1,y1,0,x2,y2);
		printf("%d\n",mmin);
	}
}


#include <bits/stdc++.h>
using namespace std;
int we[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,  
};  
struct haha{
	int x,y,w;
};
int zz[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int aa[9][9]; 
int dfs(int x1,int y1,int x2,int y2){
	haha ans;
	ans.x=x1;
	ans.y=y1;
	ans.w=0;
	aa[x1][y1]=1;
	queue<haha>q;
	q.push(ans);
	while(!q.empty()){
		haha gg=q.front();
		q.pop();
		if(gg.x==x2 && gg.y==y2)
			return gg.w;
		for(int i=0;i<4;i++){
			haha jiu;
			int xx=gg.x+zz[i][0];
			int yy=gg.y+zz[i][1];
			if(xx>=0 && xx<9 && yy>=0 && yy<9 && we[xx][yy]!=1 && aa[xx][yy]!=1){
				aa[xx][yy]=1;
				jiu.x=xx;
				jiu.y=yy;
				jiu.w=gg.w+1;
				q.push(jiu);
			}
		}
	}
}
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		int x1,y1,x2,y2;
		memset(aa,0,sizeof(aa));
		scanf("%d %d  %d %d",&x1,&y1,&x2,&y2);
		printf("%d\n",dfs(x1,y1,x2,y2));
		
	}
}

题目链接http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=58

Android自定义控件系列之九宫格解锁

本课程针对中高级程序员,讲述了如何自定义绘制九宫格,属于难度稍高的自定义控件。
  • 2016年07月15日 15:35

智力拼图任意情况求最少步数解

  • 2011年08月27日 13:36
  • 203KB
  • 下载

NYOJ 最少步数

最少步数 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 这有一个迷宫,有0~8行和0~8列:  1,1,1,1,1,1,1,1,1...
  • Viscu
  • Viscu
  • 2016-08-17 19:53:59
  • 363

最少步数(广搜)

最少步数 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 这有一个迷宫,有0~8行和0~8列:  1,1,1,1,1,1,1,1,1...
  • hanyuboke
  • hanyuboke
  • 2015-04-02 22:49:36
  • 498

迷宫最少步数的求解(利用队列)

采用广度优先遍历的方式从起点开始遍历,一直到没有路径可以走,即队列为空。#include #include #define M 10 /*******求出迷宫的最短路径步数以及路径,-1代表障碍物和外...
  • amanicspater
  • amanicspater
  • 2015-11-24 11:44:41
  • 700

NYoj-58最少步数

题目链接:   点击打开链接 最少步数 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 这有一个迷宫,有0~8行和0~8列:  1,1,1,1,1...
  • Cai_Nia
  • Cai_Nia
  • 2016-07-28 23:51:05
  • 640

广度优先搜索:迷宫最少步数

题目对于一个10*10的迷宫,入口在第一行第二列,出口在最后一行第九列。迷宫中“#”代表墙,“.”代表通路,从任意一个“.”点只能一步走到上下左右四个方向的“.”点。求出走出迷宫所需要的最少步数。 测...
  • zhufenghao
  • zhufenghao
  • 2017-04-24 00:17:38
  • 593

最少步数(迷宫问题类型)

最少步数 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 这有一个迷宫,有0~8行和0~8列:  1,1,1,1,1,1,1,1,1  1,0,0,1,0,0...
  • qaz135135135
  • qaz135135135
  • 2016-07-21 22:10:17
  • 936

推箱子寻求最少步数(广度优先搜索)

“推箱子”这个经典的游戏,具体规则就是在一个N*M的地图上,有1个玩家、1个箱子、1个目的地以及若干障碍,其余是空地。玩家可以往上下左右4个方向移动,但是不能移动出地图或者移动到障碍里去。如果往这个方...
  • u012017783
  • u012017783
  • 2017-10-18 10:05:11
  • 287

最少步数 (bfs最短路径)

描述 这有一个迷宫,有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...
  • qq_36238595
  • qq_36238595
  • 2017-02-09 15:12:26
  • 562
收藏助手
不良信息举报
您举报文章:最少步数
举报原因:
原因补充:

(最多只允许输入30个字)