菜鸟系列——搜索

来源:互联网 发布:阿里云给我打电话 编辑:程序博客网 时间:2024/05/17 21:51

菜鸟就要老老实实重新学起:

DFS、BFS:

优先深度搜索、优先广度搜索,思想很简单,看怎么用了。

eg:

POJ3037 Skiing

http://poj.org/problem?id=3037

题意:

一个矩阵各点有不同高度,从 A点到周围4个B点的速度是 V = Va*(2^(Ha-Hb))。

给出初速度,矩阵高,矩阵宽。高度矩阵。

求左上到右下所用最短时间。

思路:

初始高度和速度给出,所以各点的速度其实一定,直接算出。

BFS+优先队列

code:

#define INF 0x3f3f3f3f#define MAX 1000010000000#define N 123int n,m,v;int flag,sum,ave,ans,res;int g[N][N];double mintime[N][N];int dis[4][2] = {{1.0},{-1,0},{0,1},{0,-1}};struct node{    int x,y;    double s,t;    friend bool operator < (node a, node b)    {        return a.t > b.t;    }}tn;priority_queue<node> q;double bfs(node t){    int i,x,y;    node f,h;    q.push(t);    while(!q.empty())    {        f = q.top();        q.pop();        if(f.x==n&&f.y==m)            return f.t;        for(i=0;i<4;i++)        {            h = f;            h.x+=dis[i][0];            h.y+=dis[i][1];            if(!(h.x>n||h.x<=0||h.y>m||h.y<=0))            {                h.s = f.s*pow(2.0,g[f.x][f.y]-g[h.x][h.y]);                h.t+=1.0/f.s;                if(mintime[h.x][h.y]>h.t)                {                    mintime[h.x][h.y] = h.t;                    q.push(h);                }            }        }    }}int main(){    int i,j,k,kk,t,x,y;    while(scanf("%d%d%d",&v,&n,&m)!=EOF&&n)    {        for(i=1;i<=n;i++)            for(j=1;j<=m;j++)                scanf("%d",&g[i][j]);        for(i=1;i<=n;i++)            for(j=1;j<=m;j++)                mintime[i][j] = MAX;        node start;        start.s=v;        start.x = start.y = 1;        start.t = 0;        printf("%.2lf\n",bfs(start));    }    return 0;}


POJ3187 Backward Digit Sums

http://poj.org/problem?id=3187

题意:

杨辉三角规则,给与根的大小和三角层数,求最下一行的数字,多解时给出字典序最小的解。

思路:

dfs暴搜即可。

code:

#define N 12int n,m;int flag,sum,ave,ans,res;int a[N][N];bool vis[N];bool check(){    for(int i=1;i<n;i++)        for(int j=0;j<n-i;j++)            a[i][j] = a[i-1][j]+a[i-1][j+1];    return a[n-1][0] == m;}void dfs(int now){    if(now == n)    {        if(check() && flag)        {            for(int i=0;i<n;i++)                printf("%d ",a[0][i]);            printf("\n");            flag=0;        }        return ;    }    for(int i=1;i<=n;i++)    {        if(vis[i] && flag)        {            vis[i] = false;            a[0][now] = i;            dfs(now+1);            vis[i] = true;        }    }}int main(){    int i,j,k,kk,t,x,y;    while(scanf("%d%d",&n,&m)!=EOF&&n)    {        flag=1;        memset(vis,true,sizeof(vis));        dfs(0);    }    return 0;}


0 0
原创粉丝点击