概述
不知道该说些啥
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
struct Node {
int r, c, dir; // 站在(r,c),面朝方向dir(0~3分别表示N, E, S, W)
Node(int r=0, int c=0, int dir=0):r(r),c(c),dir(dir) {}
};
const char* dirs = "NEWS";
const char* turns = "FLR";
const int maxn = 10;
int has_edge[maxn][maxn][4][3]; //保存每一个坐标的具体转向方式
char d[maxn][maxn][4]; //用来累加起点到终点的距离 ;
Node p[maxn][maxn][4]; //用来记录该结点的父结点 ;
int c1,c2,c0,r1,r2,r0,dir;
int dir_id(char c)
{
return strchr(dirs,c)-dirs; //返回c在dirs所在的下标,确定行走方向;
}
int turn_id(char c)
{
return strchr(turns,c)-dirs; //返回c在turns所在的下标,确定转向;
}
const int dr[] = {-1, 0, 1, 0}; //确定行走的方向的数组;
const int dc[] = {0, 1, 0, -1};
Node walk(const Node& u, int turn)
{
int dir =u.dir;
if(turn == 1) dir = (dir + 3) % 4; //逆时针,左转;
if(turn == 2) dir = (dir + 1) % 4; //顺时针,右转;
return Node(u.r +dr[dir], u.c + dc[dir], dir);
}
//判断坐标是否出界
bool inside(int r, int c) {
return r >= 1 && r <= 9 && c >= 1 && c <= 9;
}
bool read_case() {
char s[99], s2[99];
//s是指当前的流程,r0表示起始行,c0表示起始列,s2起始方向,
//r2表示目标行,c2表示目标列
if(scanf("%d%d%s%d%d", &r0, &c0, s2, &r2, &c2) != 5) return false;
dir = dir_id(s2[0]);//方向在字符串dirs中的位置
r1 = r0 + dr[dir];//第一步之后的行坐标
c1 = c0 + dc[dir];//第二步之后的列坐标
memset(has_edge, 0, sizeof(has_edge));
for(;;)
{
int r, c;
scanf("%d", &r);
if(r == 0) break;
scanf("%d", &c);
while(scanf("%s", s) == 1 && s[0] != '*') {
for(int i = 1; i < strlen(s); i++)
has_edge[r][c][dir_id(s[0])][turn_id(s[i])] = 1;
}
}
return true;
}
void print_ans(Node u)
{
vector<Node> nodes;
for(;;)
{
nodes.push_back(u);
if(d[u.r][u.c][u.dir] == 0)
break;
u = p[u.r][u.c][u.dir];
}
nodes.push_back(Node(r0, c0, dir));
int cnt = 0;
for(int i = nodes.size() - 1; i >= 0; i--)
{
if(cnt % 10 == 0) printf(" ");
printf("(%d,%d)",nodes[i].r, nodes[i].c);
if(++cnt % 10 == 0) printf("n");
}
if(nodes.size() % 10 != 0) printf("n");
}
//BFS解决;
void solve()
{
queue<Node> q;
memset(d, -1, sizeof(d));
Node u (r1, c1, dir);
d[u.r][u.c][u.dir] = 0;
q.push(u);
while(!q.empty())
{
Node u = q.front();q.pop();
if(u.c == c2 && u.r == r2)
{
print_ans(u);
return;
}
for(int i = 0; i < 3; i++)
{
Node v = walk(u, i);
if(has_edge[u.r][u.c][u.dir][i] && inside(v.r, v.c) &&
d[v.r][v.c][v.dir] < 0)
{
d[v.r][v.c][v.dir] = d[u.r][u.c][u.dir]+1;
p[v.r][v.c][v.dir] = u;
q.push(v);
}
}
}
printf("No Solution Possiblen");
}
int main() {
while(read_case()) {
solve();
}
return 0;
}
最后
以上就是独特蜜蜂为你收集整理的紫书上的例题,关于BFS的全部内容,希望文章能够帮你解决紫书上的例题,关于BFS所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复