poj 3984

求从左上角到右下角的最短路径,1是路,2是墙,只可以前后左右的走。


dfs:

#include<cstdio>
#include<cstring>
using namespace std;

int maze[5][5];
int ans;
bool vis[5][5];
const int dir[4][2]={0,1,0,-1,1,0,-1,0};

struct node{
    int x,y;
} way[30],best[30];

void dfs(int nodex, int nodey, int deep){
    int x,y;
    if(nodex==4&&nodey==4&&deep<ans){
        ans=deep;
        for(int i=0;i<ans;i++){
            best[i].x=way[i].x;
            best[i].y=way[i].y;
        }
    }
    for(int i=0;i<4;i++){
        x=nodex+dir[i][0];
        y=nodey+dir[i][1];
        if(x<0||y<0||x>4||y>4||maze[x][y]==1||vis[x][y]==true)
            continue;
        else{
            vis[x][y]=true;
            way[deep].x=x;
            way[deep].y=y;
            dfs(x,y,deep+1);
            vis[x][y]=false;
        }
    }
}

int main(){
    for(int i=0;i<5;i++){
        for(int j=0;j<5;j++){
            scanf("%d",&maze[i][j]);
        }
    }
    ans=1000;
    memset(way,0,sizeof(way));
    memset(best,0,sizeof(best));
    memset(vis,false,sizeof(vis));
    way[0].x=0;
    way[0].y=0;
    vis[0][0]=true;
    dfs(0,0,1);
    for(int i=0;i<ans;i++){
        printf("(%d, %d)\n",best[i].x,best[i].y);
    }
    return 0;
}

bfs:

#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;

int step[5][5],maze[5][5];
bool vis[5][5];
int dir[4][2]={1,0,-1,0,0,1,0,-1};
struct node{
    int x;
    int y;
    node(int _x,int _y):x(_x),y(_y){}
};
queue<node> q;

void bfs(){
    node start(0,0);
    q.push(start);
    vis[0][0]=true;
    while(!q.empty()){
        node head=q.front();
        q.pop();
        for(int i=0;i<4;i++){
            node next(head.x+dir[i][0],head.y+dir[i][1]);
            if(next.x<0||next.x>4||next.y<0||next.y>4||(vis[next.x][next.y]==true)||(maze[next.x][next.y]==1)){
                continue;
            }
            else{
                q.push(next);
                step[next.x][next.y]=step[head.x][head.y]+1;
                vis[next.x][next.y]=true;
            }
            if(next.x==4&&next.y==4)
                return;
        }
    }
}

int main(){
    memset(step,0,sizeof(step));
    memset(vis,false,sizeof(vis));
    for(int i=0;i<5;i++){
        for(int j=0;j<5;j++){
            scanf("%d",&maze[i][j]);
        }
    }
    bfs();
    int cnt=0;
    for(int i=0;i<5;i++){
        for(int j=0;j<5;j++){
            if(step[i][j]==cnt){
                printf("(%d, %d)\n",i,j);
                cnt++;
            }
        }
    }
    return 0;
}

最后读取路线的时候,因为是从左上到右下,所以循环读取到第一个符合cnt值的地方就是最佳路径。

for(int i=0;i<5;i++){
        for(int j=0;j<5;j++){
            if(step[i][j]==cnt){
                printf("(%d, %d)\n",i,j);
                cnt++;
                }

这里本来我写的是:

for(int i=0;i<5;i++){
        for(int j=0;j<5;j++){
            if(step[i][j]==cnt++){
                printf("(%d, %d)\n",i,j);
                }

注意看后发现每次循环后面的写法都会导致cnt增加,最后结果出错。

猜你喜欢

转载自blog.51cto.com/13688928/2106736