UVA439深搜和宽搜区别

63 篇文章 0 订阅
24 篇文章 0 订阅

这题其实就是一个变种的宽搜,很简单,可是后来发现自己把宽搜和深搜给记反了,这题就一直写的是深搜,

但是显然宽搜的题用深搜做事不对的,也学可以,反正本弱不会,但是前面几个深搜的题目,我都是用宽搜

做的,事实证明深搜的题目是可以用宽搜来做的,而深搜和宽搜的最主要区别就是深搜用栈来实现,而宽搜用

队列来实现,然后想象一下栈和队列的调用过程,很简单就可以知道深搜和宽搜的区别。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
#include<cctype>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<stack>
#include<ctime>
#include<algorithm>
#include<sstream>
#define LL long long
using namespace std;
struct node
{
    int x,y;
    node(int x,int y):x(x),y(y) {};
};
int dx[8]={-2,-1,-1,-2,1,2,1,2},dy[8]={-1,-2,2,1,-2,-1,2,1};
int grid[10][10],vis[10][10];
int d[10][10];
//int pos;
int rx,ry;
char b1,b2;
int a1,a2;
void bfs(node u)
{
    int flag=0;
    queue<node> q;
    q.push(u);
    while(!q.empty())
    {
        node dd=q.front();
        int x=dd.x;
        int y=dd.y;
        if(x==rx&&y==ry) {return;}
        q.pop();
        for(int i=0;i<8;i++)
        {
            int ax=x+dx[i];
            int ay=y+dy[i];
            if(ax>0&&ax<=8&&ay>0&&ay<=8&&vis[ax][ay]==0)
            {
                vis[ax][ay]=1;
                d[ax][ay]=d[x][y]+1;
                if(x==rx&&y==ry) {return;}
            // cout<<ax<<' '<<ay<<endl;
                q.push(node(ax,ay));
            }
        }
    }

}
int main()
{
    while(scanf("%c%d %c%d",&b1,&a1,&b2,&a2)!=EOF)
    {
        getchar();
        memset(vis,0,sizeof(vis));
        memset(d,0,sizeof(d));
        rx=a2;
        ry=b2-'a'+1;
        //pos=0;
      //  cout<<rx<<' '<<ry<<' '<<a1<<' '<<(int)(b1-'a'+1)<<endl;
        vis[a1][(b1-'a'+1)]=1;
        bfs(node(a1,(int)(b1-'a'+1)));
        printf("To get from %c%d to %c%d takes %d knight moves.\n",b1,a1,b2,a2,d[rx][ry]);
    }
    return 0;
}


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值