poj 3986(bfs)

打印路径的bfs

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <map>
#include <queue>
using namespace std;
const int maxn=10;
int a[maxn][maxn];
int dic[10][5]={{1,0},{-1,0},{0,-1},{0,1}};
struct note
{
    int x;
    int y;
    bool operator <(const note &p) const//map具有自动排序功能,要指定优先级
    {
        return x<p.x||(x==p.x)&&(y<p.y);
    }
}aa[50];
map<note,note> mp;
note bfs()
{  a[1][1]=1;
    queue<note> q;
    q.push(note{1,1});
     while(q.size())
     {
          note pp=q.front();
          q.pop();
        for(int i=0;i<4;i++)
        {
            int xx=pp.x+dic[i][0];
            int yy=pp.y+dic[i][1];
         note mmp=mp[note{3,4}];
          if(xx>=1&&xx<=5&&yy>=1&&yy<=5&&a[xx][yy]!=1)
          {
              mp[note{xx,yy}]=note{pp.x,pp.y};//存储路径
              note mmp=mp[note{xx,yy}];
              if(xx==5&&yy==5) return note{xx,yy};
              a[xx][yy]=1;
              q.push(note{xx,yy});
          }
        }
     }
}
void put(note t)
{
    memset(aa,0,sizeof(aa));
    int cnt=0;
     for(note i=t;;i=mp[i])
     {
         aa[cnt++]=i;
         if(i.x==1&&i.y==1) break;
     }
     for(int i=cnt-1;i>=0;i--)
        printf("(%d, %d)\n",aa[i].x-1,aa[i].y-1);
}
int main()
{
     while(~scanf("%d",&a[1][1]))
     {
         mp.clear();
         for(int i=2;i<=5;i++)
             scanf("%d",&a[1][i]);
           for(int i=2;i<=5;i++)
              for(int j=1;j<=5;j++)
                scanf("%d",&a[i][j]);
           note nn=bfs();
           put(nn);
     }
    return 0;
}
时间: 2024-10-25 02:33:18

poj 3986(bfs)的相关文章

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 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

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<