搜索入门

来源:互联网 发布:域名提供商查询 编辑:程序博客网 时间:2024/05/16 01:30

一.迷宫的最短路径题意

        一个N*M的迷宫,每一步可以向上下左右移动,求从起点到终点的最短路径

二.解法

typedef pair<int,int>  P;char Mz[MXN][MXM]; // 迷宫数组int N,M;int sx,sy;int gx,gy;int d[MXN][MXM];//距离数组int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};int Bfs(){    queue<P> que;    for(int i=0;i<N;++i)        for(int j=0;j<M;++j)            d[i][j]=INF;    que.push(P(sx,sy));    d[sx][sy]=0;    while(q.size())    {        P p=que.front();que.pop();        if(p.first ==gx &&p.second==gy) break;        for(int i=0;i<4;++i)        {            int nx=p.first+dx[i];            int ny=p.second+dy[i];            if(0<=nx&&nx<N&&0<=ny&&ny<M&&maze[nx][ny]!='#'&&d[nx][ny]==INF)            {                que.push(P(nx,ny));                d[nx][ny]=d[p.first][p.second]+1;            }        }    }    return d[gx][gy];}

三.宽度搜索与深度搜索区别

bfs需要与状态数成正比的内存空间.Dfs所需内存是与最大递归深度成正比的

四.枚举n!

bool used[MXN];int perm[MXN];//生成n!种排列void permutation(int pos,int n){    if(pos==n){        //这里写需要对perm进行的操作        return;    }    for(int i=0;i<n;++i){        if(!used[i]){            perm[pos]=i;            used[i]=true;            permutation1(pos+1,n);            used[i]=false;        }    }    return ;}