POJ 2935 BFS

给出6*6的矩阵,起点,终点,一共三堵墙,墙不会相交。

求起点到终点的最少步,保证有解

对每次移动判断相对应的是否有墙即可

#include "stdio.h"
#include "string.h"
#include "queue"
using namespace std;

const int dir[4][2]={ {1,0},{-1,0},{0,1},{0,-1} };
int wall[10][10][10][10];
int s_x,s_y,e_x,e_y;
int used[10][10];
struct node
{
    int x,y;
};

void pri(int x,int y)
{
    if (used[x][y]==0) return ;

    if (used[x][y]==1)
    {
        pri(x-1,y);
        printf("S");
    }
    if (used[x][y]==2)
    {
        pri(x+1,y);
        printf("N");
    }
    if (used[x][y]==3)
    {
        pri(x,y-1);
        printf("E");
    }
    if (used[x][y]==4)
    {
        pri(x,y+1);
        printf("W");
    }
}

void bfs()
{
    queue<node>q;
    node cur,next;
    int i;

    cur.x=s_x;
    cur.y=s_y;
    q.push(cur);
    memset(used,-1,sizeof(used));
    used[cur.x][cur.y]=0;
    while (!q.empty())
    {
        cur=q.front();
        q.pop();
        for (i=0;i<4;i++)
        {
            next.x=cur.x+dir[i][0];
            next.y=cur.y+dir[i][1];
            if (next.x<=0 || next.x>6 || next.y<=0 || next.y>6) continue;
            if (i==0 && wall[cur.x][cur.y-1][cur.x][cur.y]==1) continue;
            if (i==1 && wall[next.x][next.y-1][next.x][next.y]==1) continue;
            if (i==2 && wall[cur.x-1][cur.y][cur.x][cur.y]==1) continue;
            if (i==3 && wall[next.x-1][next.y][next.x][next.y]==1) continue;
            if (used[next.x][next.y]!=-1) continue;
            used[next.x][next.y]=i+1;
            q.push(next);
            if (next.x==e_x && next.y==e_y)
            {
                pri(next.x,next.y);
                printf("\n");
                return ;
            }
        }
    }
}

int main()
{
    int i,j,x1,x2,y1,y2,temp;
    while (scanf("%d%d",&s_y,&s_x)!=EOF)
    {
        if (s_x+s_y==0) break;
        scanf("%d%d",&e_y,&e_x);
        memset(wall,0,sizeof(wall));
        for (i=1;i<=3;i++)
        {
            scanf("%d%d%d%d",&y1,&x1,&y2,&x2);
            if (x1==x2)
            {
                if (y1>y2) {temp=y1; y1=y2; y2=temp;}
                for (j=y1;j<y2;j++)
                    wall[x1][j][x1][j+1]=1;
            }
            else
            {
                if (x1>x2) {temp=x1; x1=x2; x2=temp;}
                for (j=x1;j<x2;j++)
                    wall[j][y1][j+1][y1]=1;
            }
        }
        bfs();
    }
    return 0;

}
时间: 2024-10-06 13:56:03

POJ 2935 BFS的相关文章

POJ 2935 Basic Wall Maze

http://poj.org/problem?id=2935 Basic Wall Maze Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2794   Accepted: 1271   Special Judge Description In this problem you have to solve a very simple maze consisting of: a 6 by 6 grid of unit sq

POJ Multiple (BFS,同余定理)

http://poj.org/problem?id=1465 Multiple Time Limit: 1000MS   Memory Limit: 32768K Total Submissions: 6164   Accepted: 1339 Description a program that, given a natural number N between 0 and 4999 (inclusively), and M distinct decimal digits X1,X2..XM

poj 2243 bfs 利用 结构体中的step成员保存步数 ,STL的队列

//BFS #include <iostream> #include <queue> using namespace std; bool used[8][8]; int move[8][2]={1,2, -1,2, -2,1, -2,-1, -1,-2, 1,-2, 2,-1, 2,1}; struct position { int i,j; int step; position(int a,int b,int c) { i=a; j=b; step=c; } }; int mai

poj 1915 BFS 利用 pre 计算步数------------------路径

// BFS #include <stdio.h> #include <string.h> int visited[301][301]; // visited 已经访问过了 int dic[8][2]={{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2},{2,-1}}; int head,end,n,ex,ey,sx,sy; struct quene { int x,y,pre; // pre 前一个结点 }q[100000]; vo

POJ 3414-Pots(BFS)

题目地址:POJ 3414 题意:给你a,b两个容器的容量,六种操作方法,问最少多少次可以使其中一个容器里的水达到体积c,如果不能的话则输出impossible. 思路:一共有6种操作方法,0:倒满a,1:倒满b,2:把a里的水倒向b(两种情况b倒满a有剩余或者a倒完),3:把b里的水倒向a(类似2的两种情况),4:把a倒空,5:把b倒空.然后用vis[i][j]记录当a的容量为i,b的容量为j时走了多少步,op[i][j][k]记录当a的容量为i,b的容量为j时用的第k步操作是谁.然后就是乱搞

POJ - 3026(BFS+最小生成树.krustal)

题目: 题目链接: http://poj.org/problem?id=3026 Borg Maze Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17462   Accepted: 5631 Description The Borg is an immensely powerful race of enhanced humanoids from the delta quadrant of the galaxy. The

POJ 3126 BFS

题意 将一个四位的素数,变为另一个四位的素数.每次只能换一位上的数字,不能存在前导0,且中间过程中,换掉一位数字后的数也都是素数. 问最少变换的次数 分析 bfs即可 代码 1 /* When all else is lost the future still remains. */ 2 /* You can be the greatest */ 3 #define rep(X,Y,Z) for(int X=(Y);X<(Z);X++) 4 #define drep(X,Y,Z) for(int

poj 3278(bfs)

一条线上bfs搜就行 #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <queue> using namespace std; const int maxn=100000+100; int n,k; bool vis[maxn*2+100]; struct note { int x; int cnt; }; int bfs

POJ 2251 bfs

DESCRIPTION:给你一个三维的迷宫.问你是否能从起点走到终点.如果能,输出最小步数.对我来说难得就是我没有想到怎么把他给你的三维图转换成map.恩..好像解题报告上说.只要是这种的最短路都要用bfs.用dfs回很难.不太懂耶.>_<... 然后就是普通的bfs了.然后忘了三个输入全为0的时候结束程序.然后WA了一会..然后就没有然后了.233333333333 附代码: #include<stdio.h>#include<string.h>#include<