我是靠谱客的博主 独特蜜蜂,最近开发中收集的这篇文章主要介绍紫书上的例题,关于BFS,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

不知道该说些啥

#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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部