不写了很长的时间bfs该,很长一段时间的中间失误,当延期一次延伸成功的新节点的节点应该被标记为参观。否则,在某些情况下无限期延长队列。

输入一个小坑爹处理称号,能够进来当字符串被读取。然后用周围的墙上每个节点的数组变量的情况下,最后一次从搜索的两个出口。装满水,就拿小决赛两次值,然后取整个地图的最大值作为结果

/*
ID:kevin_s1
PROG:maze1
LANG:C++
*/ #include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <algorithm>
#include <cstdlib>
#include <list>
#include <cmath> using namespace std; #define INF 9999999
#define MAXH 110
#define MAXW 50
#define MAXHH 250
#define MAXWW 100 //gobal variable====
int H, W;
int HH, WW;
string maze[MAXHH];
int G[MAXH][MAXW];
int Gtmp[MAXH][MAXW];
int wall[MAXH][MAXW][4]; struct entry{
int x, y;
}; vector<entry> entrys;
int result;
int visited[MAXH][MAXW]; int direct[4][2] = {{1, 0}, {-1, 0}, {0, -1}, {0, 1}};
queue<entry> que;
//================== //function==========
void print(){
/*
for(int i = 0; i < HH; i++){
for(int j = 0; j < WW; j++){
cout<<maze[i][j];
}
cout<<endl;
}
*/
for(int i = 1; i <= H; i++){
for(int j = 1; j <= W; j++){
cout<<Gtmp[i][j]<<"|"<<G[i][j]<<" ";
}
cout<<endl;
}
} void BFS(entry start){
que.push(start);
G[start.x][start.y] = 1;
visited[start.x][start.y] = 1;
while(!que.empty()){
entry top = que.front();
que.pop();
for(int i = 0; i < 4; i++){
if(wall[top.x][top.y][i] == 1){
entry nw;
nw.x = top.x + direct[i][0];
nw.y = top.y + direct[i][1];
if(nw.x < 1 || nw.x > H || nw.y < 1 || nw.y > W)
continue;
if(visited[nw.x][nw.y] == 0){
G[nw.x][nw.y] = G[top.x][top.y] + 1;
que.push(nw);
visited[nw.x][nw.y] = 1;
}
}
}
}
return;
} //================== int main(){
freopen("maze1.in","r",stdin);
freopen("maze1.out","w",stdout);
cin>>W>>H;
HH = 2 * H + 1;
WW = 2 * W + 1;
getchar();
for(int i = 0; i < HH; i++){
getline(cin, maze[i]);
}
memset(wall, 0, sizeof(wall));
for(int i = 1; i <= H; i++){
for(int j = 1; j <= W; j++){
if(maze[2*i][2*j-1] == ' ')
wall[i][j][0] = 1;
if(maze[2*i-2][2*j-1] == ' ')
wall[i][j][1] = 1;
if(maze[2*i-1][2*j-2] == ' ')
wall[i][j][2] = 1;
if(maze[2*i-1][2*j] == ' ')
wall[i][j][3] = 1;
}
} entry tmp;
for(int i = 1; i <= H; i++){
if(wall[i][1][2] == 1){
tmp.x = i, tmp.y = 1;
entrys.push_back(tmp);
}
if(wall[i][W][3] == 1){
tmp.x = i, tmp.y = W;
entrys.push_back(tmp);
}
} for(int j = 1; j <= W; j++){
if(wall[1][j][1] == 1){
tmp.x = 1, tmp.y = j;
entrys.push_back(tmp);
}
if(wall[H][j][0] == 1){
tmp.x = H, tmp.y = j;
entrys.push_back(tmp);
}
} result = 0;
memset(visited, 0, sizeof(visited));
memset(G, INF, sizeof(G));
BFS(entrys[0]);
for(int i = 1; i <= H; i++){
for(int j = 1; j <= W; j++)
Gtmp[i][j] = G[i][j];
}
memset(visited, 0, sizeof(visited));
memset(G, INF, sizeof(G));
BFS(entrys[1]); for(int i = 1; i <= H; i++){
for(int j = 1; j <= W; j++){
G[i][j] = min(G[i][j], Gtmp[i][j]);
if(G[i][j] > result && G[i][j] != INF)
result = G[i][j];
}
} cout<<result<<endl;
return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

USACO maze1 BFS的更多相关文章

  1. 【USACO 2.4】Overfencing(bfs最短路)

    H行W列的迷宫,用2*H+1行的字符串表示,每行最多有2*W+1个字符,省略每行后面的空格.迷宫的边界上有且仅有两个出口,求每个点出发到出口的最短路. +-+-+-+-+-+ | | +-+ +-+ ...

  2. USACO Section 3.3 Camlot(BFS)

    BFS.先算出棋盘上每个点到各个点knight需要的步数:然后枚举所有点,其中再枚举king是自己到的还是knight带它去的(假如是knight带它的,枚举king周围的2格(网上都这么说,似乎是个 ...

  3. USACO 3.2 msquare 裸BFS

    又是个裸BFS... 和西安网赛那道1006一样的,只不过加上了要记录方案.顺便复习map 记录方案直接在bfs队列的结点里加一个vector<int> opt,把从开头一直到当前结点的操 ...

  4. Cow Relays 【优先队列优化的BFS】USACO 2001 Open

    Cow Relays Time Limit: 1000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others) Tota ...

  5. USACO 2012 March Silver Tractor /// 优先队列BFS oj21567

    题目大意: 输入n,(x,y):n为阻挡的草堆数量,(x,y)为开始时拖拉机所在的位置 接下来n行每行一个坐标(a,b):为各个草堆的坐标 输出拖拉机要回到原点(0,0)需要移动的草堆数量 Sampl ...

  6. POJ3083Catch That Cow[BFS]

    Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 77420   Accepted: 24457 ...

  7. 【USACO 2.1】Healthy Holsteins

    /* TASK: holstein LANG: C++ URL: http://train.usaco.org/usacoprob2?a=SgkbOSkonr2&S=holstein SOLV ...

  8. 【USACO】clocks 遇到各种问题 最后还是参考别人的思路

    //放在USACO上一直通不过 不知道哪里出了问题 输出的n总是等于1 但是BFS递归的次数是对的 <----这个问题解决了 局部变量压入queue中返回就是对的了 #include<io ...

  9. 乳草的入侵//BFS

    P1030 乳草的入侵 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 USACO OCT09 6TH 描述 Farmer John一直努力让他的草地充满鲜美 ...

随机推荐

  1. C语言获取文件SHA1哈希

    安全散列算法(Secure Hash Algorithm)主要适用于数字签名标准 (Digital Signature Standard DSS)它定义了数字签名算法(Digital Signatur ...

  2. crm2011js子网格导航栏字段事件操作

  3. Eclipse SVN 安装注意事项

    1. 下载SVN 插件 打开 Eclipse , 菜单条 Help ->  Install New Software  在 Work with 这里加入网址 : http://subclipse ...

  4. easyui出口excel无法下载框弹出的办法来解决

    使用前ajax发,码如下面(ActionUrl一般处理程序ashx路径): $.ajax({ url: ActionUrl + '?action=export&ID=' + $('#fm_ID ...

  5. import android.provider.Telephony cannot be resolved

    android.provider.Telephony is hidden. http://androidxref.com/4.0.3_r1/xref/frameworks/base/core/java ...

  6. 尝到awk

    我前几天写的sed,这个时候继续了解它的兄弟,awk,两者都使用,一种感觉.既可以用来处理场.假设你想要做文本处理.sed删除.匹配,一些频繁更换使用,假设每一行文本,你想深入,一些每行和列处理的,例 ...

  7. easyui DateTimeBox OK

    一.datetimebox   ok按钮没有点击事件,但是可以通过onSelect事件模拟出“点击了ok按钮一样的效果”,我的代码: 关键: 0,理解DateTimeBox控件,这个控件是由DateB ...

  8. 在 树莓派上使用 c++ libsockets library

    rpi默认安装的编译器是gcc-4.6.2 而现在最新的c++ libsockets library 需要使用支持c++-11特征的编译器,即需要4.8.2才可以.为此,需要先升级编译器才可以支持编译 ...

  9. iOS8推送消息的回复处理速度

    iOS8我们有一个新的通知中心,我们有一个新的通报机制.当在屏幕的顶部仅需要接收一个推拉向下,你可以看到高速接口,天赋并不需要输入应用程序的操作.锁定屏幕,用于高速处理可以推动项目. 推送信息,再次提 ...

  10. hdu1711 Number Sequence

    Problem Description Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], .... ...