最小步数 结题报告

来源:互联网 发布:中兴编程挑战赛 编辑:程序博客网 时间:2024/05/20 17:25

题目来源:http://acm.nyist.net/JudgeOnline/problem.php?pid=58

 

这题也是也是图论的范畴,这种小范围的搜索,感觉DPS和BPS的差异不是很大,在解决这道题目还是可行的。

下面我用的DPS搜索。

 

首先定义全局的变量和数据结构:

int MIN;int mize[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 point{int x,y;};vector<point> listline;


接下来是一个比较两个点是否匹配的函数,用了内联的方式。

inline bool comp(point a,point b){if(a.x==b.x&& a.y==b.y) return true;return false;}


下面就是核心的DPS递归算法,listline 这个栈是用来存储已经被搜索过的地方。

函数名fun(now,targe,deep):

 now 当前搜索的点,

 targe 目标点。

 deep 是深度,与开始点的距离。用来判断最小步数的。

递归函数的思路如下:

1、检查是否达到目标点,达到则记录最小深度。。

2、如果越界,返回。

3、如果==1,返回。

4、如果已经被搜索,返回。

5、now点入栈,进行四个方向上的递归调用,now点出栈。

 

函数体代码如下:

void fun(point now,point targe,int deep){if(comp(now,targe)){   if(deep <MIN) MIN=deep;} if(now.y<0 || now.y>=9) return ; if(targe.x<0 || targe.x>=9) return ; if(mize[now.y][now.x]==1) return;  for(vector<point>::iterator i=listline.begin();i!=listline.end();i++)  { if(comp(*i,now)) return;  }       listline.push_back(now); point temp;    temp.x=now.x-1;temp.y=now.y; fun(temp,targe,deep+1);     temp.x=now.x+1;temp.y=now.y;     fun(temp,targe,deep+1);    temp.x=now.x;temp.y=now.y-1;fun(temp,targe,deep+1);     temp.x=now.x;temp.y=now.y+1;fun(temp,targe,deep+1); listline.pop_back(); }


接下来是main()函数了,很简单,就是输入、调用fun(source,targe,0)、输出。

int main(){int N;cin>>N;while(N--){MIN=1000;        listline.clear();        point source,targe;        cin>>source.y>>source.x>>targe.y>>targe.x;        //listline.push_back(source);        fun(source,targe,0);        cout<<MIN<<endl;}return 0;} 


这道题目AC了,不过离最优程序还是有点低。

 

 

包含文件如下:

#include <iostream>
#include <string.h>
#include <vector>
using namespace std;
原创粉丝点击