图搜索基础

来源:互联网 发布:thinkphp开发cms 编辑:程序博客网 时间:2024/06/05 19:51

递归框架
int robbot(int x,int y) //机器人的输入
if(边界条件) //什么时候不用造了(自己就能造完)
return 0;
int a=robbot(x1,y1); //造一个小的自己帮忙干活
int b=robbot(x2,y2); //再造一个小的自己帮忙干活
return a+b; //自己要做的就是把别人的成果组转起来

比如有一道求子集的算法题,输入一组数组的数据,输出他们的子集。

 #include<iostream> using namespace std; int nums[]={1,2,3}; bool visit[10000]; void print(){    for(int i=0;i<sizeof(nums)/sizeof(int);++i){        if(visit[i])        cout<<nums[i]<<" ";     }     cout<<endl; } void robbot(int idx,int nums[]){    if(idx>sizeof(nums)/sizeof(int)){        print();        return ;     }     visit[idx]=true;;     robbot(idx+1,nums);     visit[idx]=false;     robbot(idx+1,nums); } int main(){    robbot(0,nums);    return 0; }

输出:
1 2 3
1 2
1 3
1
2 3
2
3

最后一行为空。

深度优先搜索:伪代码void DFS(int v)         visited[v]=true;         for(v的每一个邻接点)             if(!visted[w])     //如果没被访问过                 DFS(w)

Q-queen

#include<iostream>using namespace std;#define num 4int path[100];bool hang[100],zheng[100],fan[100]; void print(int n){    for(int i=0;i<n;i++){        for(int j=0;j<n;j++){            if(i==path[j]){                cout<<"Q";            }else{                cout<<".";            }        }cout<<endl;    }    cout<<endl<<endl;}void DFS(int idx,int n){    if(idx>=n){    print(n);    return ;    }    for(int i=0;i<n;++i){        if(!hang[i]&&!zheng[idx+i]&&!fan[idx-i+n-1]){            path[idx]=i;            hang[i]=true;            zheng[idx+i]=true;            fan[idx-i+n-1]=true;            DFS(idx+1,n);            hang[i]=false;            zheng[idx+i]=false;            fan[idx-i+n-1]=false;        }    }}int main(){    DFS(0,num);    return 0;}

骑士游历问题
在国际象棋中,马走日,问骑士从棋盘的左下角出发,能够不重复的遍历完整个棋盘。下面的代码框架和上面的N皇后问题完全一样。

int fx = {1,1,-1,-1,2,2,-2,-2};int fy = {2,-2,2,-2,1,-1,1,-1}; // fx,fy 数组记录骑士的规则void DFS(int xi,int yi,int n){    if(idx>=n){    print(n);    return ;    }    for(int i=0;i<8;++i){        int newx=xi+fx[i];        int newy=yi+fy[i];        if(!visit[newx][newy]){            visit[newx][newy]=true;            DFS(idx+1,n);            visit[newx][newy]=false;        }    }}