poj 2935 Basic Wall Maze bfs

很简单的bfs,各点都从0开始保存,可以用%和/确定x,y省空间

 

/*
author:jxy
lang:C/C++
university:China,Xidian University
**If you need to reprint,please indicate the source**
*/
#include <cstdio>
#include <cstring>
#include <queue>
#define place(x,y) x+y*6
using namespace std;
const int dir[4][2]={0,-1,1,0,0,1,-1,0};
const char d[4]={'N','E','S','W'};
bool no[7][7][4];
int vis[40],start,end,now,next;
queue<int> q;
void output(int x)
{
    if(x==start)return;
    output(vis[x]/10);
    printf("%c",d[vis[x]%10]);
}
int main()
{
    int x,y,tx,ty,i;
    while(scanf("%d%d",&x,&y)&&x+y)
    {
        memset(no,0,sizeof(no));
        memset(vis,0,sizeof(vis));
        while(!q.empty())q.pop();
        start=place(--x,--y);
        scanf("%d%d",&x,&y);
        end=place(--x,--y);
        for(i=0;i<3;i++)
        {
            scanf("%d%d%d%d",&x,&y,&tx,&ty);
            if((x==tx&&(x==0||x==6))||(y==ty&&(y==0||y==6)))continue;
            if(x==tx)
              for(;y<ty;y++) no[x][y][3]=no[x-1][y][1]=1;
            else
              for(;x<tx;x++) no[x][y][0]=no[x][y-1][2]=1;
        }
        vis[start]=-1;
        q.push(start);
        while(!q.empty()&&!vis[end])
        {
            now=q.front();q.pop();
            x=now%6;y=now/6;
            for(i=0;i<4;i++)
            {
                tx=x+dir[i][0];
                ty=y+dir[i][1];
                next=place(tx,ty);
                if(tx<0||tx>5||ty<0||ty>5||no[x][y][i]||vis[next])continue;
                vis[next]=now*10+i;
                q.push(next);
            }
        }
        output(end);
        puts("");
    }
}

 

时间: 2024-12-30 14:53:07

poj 2935 Basic Wall Maze bfs的相关文章

POJ 1915 Knight Moves 双向BFS 入门

 Description Background Mr Somurolov, fabulous chess-gamer indeed, asserts that no one else but him can move knights from one position to another so fast. Can you beat him? The Problem Your task is to write a program to calculate the minimum number o

迷宫求解非递归 DFS BFS(应用栈和队列)

栈和队列的应用对迷宫问题求解 没有递归 自己手动建的栈和队 并且输出路径 DFS的路径就是 栈中的坐标 BFS的路径在队又开了一个域存上一层的base值 语言还是用的C++ 感觉比C的封装性好很多 充分体会了一下DFS一边比BFS快 但是BFS是最优解而DFS可能不是最优解   #include <iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace

poj 1985 Cow Marathon

点击打开poj 1985 思路: 两次bfs找到树的直径 分析: 1 题目给定一棵树,找树上两点最远距离 2 利用两次bfs就可以,第一次bfs从1开始求出到最远的点,然后从这个点再次bfs回来求出ans即可 代码: #include<queue> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> usi

POJ 3206 Borg Maze:BFS+Prim

Borg Maze:http://poj.org/problem?id=3026 大意:给你一个m*n的迷宫,可以上下左右的走,只能走空格或字母,求出将所有字母连通起来的最小耗费. 思路:先用BFS求出S到所有A的距离,再用Prim求最小生成树,求出最小耗费.这个题坑的不在题,是数据太坑了,在空格处理上没弄好,贡献了好几个WA和CE,看Discuss才知道很坑,最后用G++过了的代码,C++还RE,实在不知道说什么好了  =.= 更多精彩内容:http://www.bianceng.cnhttp

POJ 2251 Dungeon Master (BFS)

Description You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of unit cubes which may or may not be filled with rock. It takes one minute to move one unit north, south, east, west, up or down. You cannot m

【UVA 10307 Killing Aliens in Borg Maze】最小生成树, kruscal, bfs

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20846 POJ 3026是同样的题,但是内存要求比较严格,并是没有过... 对以迷宫形式给定的一些点求最小生成树,不过这里的边并不是抽象的两点间笛卡尔距离,也不是折线距离(迷宫中有障碍),而是需要用四个方向的搜索来求. 用bfs求出任两点间的最短距离后,可用kruscal求出最小生成树. 这次值得一提的是对并查集的一点改造:由于每个顶点由一组(x,y)坐标唯一确定

poj 3984 bfs

http://poj.org/problem?id=3984 #include<iostream> #include<stdio.h> #include<cstring> #define Max 0x7f7f7f7f using namespace std; int map[6][6]; int visited[6][6]; int dir[4][2]={{1,0},{-1,0},{0,-1},{0,1}}; int ans[6][6]; int pre[30]; st

poj 3414 Pots bfs+模拟

#include<iostream> #include<cstring> #define fillA 1 #define pourAB 2 #define dropA 3 #define fillB 4 #define pourBA 5 #define dropB 6 #define N 10000 using namespace std; int vis[105][105]; class node { public: int A, B; int dir; node() { A=0

poj 3206 Borg Maze MST

    很无聊的题目,先bfs求下最短,再prim,输入还有多余空格--懒得敲了,随便找了个代码. 以下代码从http://hi.baidu.com/00gfzs/item/6dd7bf221b955c404799624a转载 #include <iostream> #include <queue> #include <cstring> #include <cstdio> using namespace std; int Val[102]; //prim记录