main.cpp

来自「我做的一些C语言练习题,里面一共有76道题目,主要用到一些计算机常用的算法,如:」· C++ 代码 · 共 125 行

CPP
125
字号
/***********************************************************************************
12. 下图是一个集装箱仓库,阴影部分表示有集装箱存放不能通过,无阴影处为临时通
 道。当有人要从入口处到达出口处时,必须寻找可通过路线,请你找出可完成这个过程
 的最方便(即用最短路线)到达出口处的路径。

          ┎┰┰┰入口┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┒
          ┠╂╂╂──╂╂╂╂┸┸╂┸┸╂┸┸╂┸┸╂╂╂╂┸┸╂╂╂┨
          ┠╂╂╂──╂┸┸╂──╂┰┰╂┰┰╂──╂╂╂╂──╂╂╂┨
          ┠╂╂╂──╂┰┰╂┰┰╂╂╂╂╂╂╂──╂┸┸╂──╂╂╂┨
          ┠╂╂╂──╂╂╂╂╂╂╂╂╂╂╂╂╂┰┰╂┰┰╂┰┰╂╂╂┨
          ┠╂╂╂──╂┸┸╂┸┸╂┸┸╂┸┸╂┸┸╂┸┸╂┸┸╂╂╂┨
          ┠╂╂╂──╂┰┰╂┰┰╂┰┰╂──╂┰┰╂──╂┰┰╂╂╂┨
          ┠╂╂╂──╂╂╂╂╂╂╂╂╂╂──╂╂╂╂──╂╂╂╂╂╂┨
          ┠╂╂╂──╂╂╂╂┸┸╂┸┸╂──╂╂╂╂──╂┸┸╂╂╂┨
          ┠╂╂╂──╂╂╂╂┰┰╂┰┰╂┰┰╂╂╂╂┰┰╂──╂╂╂┨
          ┖┸┸┸──┸┸┸┸┸┸┸┸┸┸┸┸┸┸┸┸┸┸┸出口┸┸┸┚
		   输入:入口:(1,2) 出口:(10,9)
		   输出:路径
		   方法: 深度优先,广度优先
************************************************************************************/


//#include <stdio.h>
#include <queue>
using namespace std;

#define ENDDIRT 5

struct Node
{
	int row;
	int col;
};

int dr[4] = {-1,0,1,0};
int dc[4] = {0,1,0,-1};

int maze[10][10] = {
	1,0,1,1,1,1,1,1,1,1,
	1,0,1,0,0,0,0,1,0,1,
	1,0,0,0,1,1,0,1,0,1,
	1,0,1,1,1,1,0,0,0,1,
	1,0,1,1,1,1,1,1,1,1,
	1,0,0,0,0,0,0,0,0,1,
	1,0,1,1,1,0,1,0,1,1,
	1,0,1,1,1,0,1,0,1,1,
	1,0,1,0,0,0,1,0,0,1,
	1,0,1,1,1,1,1,1,0,1}; 

static int dirt[12][12];

void PrintPath(Node start)
{
	int direct;
	Node cur = start;
	printf("(%d,%d)",cur.row,cur.col);
	while((direct=dirt[cur.row][cur.col]) != ENDDIRT)
	{
		cur.row = cur.row - dr[direct];
		cur.col = cur.col - dc[direct];
		printf(" -> (%d,%d)",cur.row,cur.col);
	}
	printf("\n");
}

void main()
{
	int row,col;
	int map[12][12];
	Node cur;
	queue<Node> q;
	Node start = {1,2};
	Node end = {10,9};
	int flag = 0;

	for(row=0; row<12; row++)
	{
		for(col=0; col<12; col++)
			if(row==0 || col==0 || row==11 || col==11)
				map[row][col] = 1;
			else map[row][col] = maze[row-1][col-1];
	}
	q.push(end);
	dirt[end.row][end.col] = ENDDIRT;
	
	while(!q.empty())
	{
		cur = q.front();
		//走过的路要屏蔽掉
		map[cur.row][cur.col] = 1;
		q.pop();
		if(cur.row == start.row && cur.col == start.col)
		{
			flag = 1;
			break;
		}
		else
		{
			int i;
			Node temp;
			for(i=0; i<4; i++)
			{
				temp.row = cur.row + dr[i];
				temp.col = cur.col + dc[i];
				if(map[temp.row][temp.col] == 0)
				{
					q.push(temp);
					dirt[temp.row][temp.col] = i;
				}
			}
		}
	}
	if(flag == 1)
	{
		//输出路径
		printf("Have path!\n");
		PrintPath(start);
	}else
	{
		printf("No path!\n");
	}
	
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?