迷宫问题-坐标系解法

 

/*
Description  
     每组测试数据以三个整数N,M,T(0<n, m≤20, t>0)开头,分别代表迷宫的长和高,以及公主能坚持的天数。 
	 紧接着有M行,N列字符,由".","*","P","S"组成。其中 "." 代表能够行走的空地。 "*" 代表墙壁,王子不能从此通过。 
	 "P" 是公主所在的位置。 "S" 是王子的起始位置。 每个时间段里王子只能选择“上、下、左、右”任意一方向走一步。
Prototype
     int SSaveP (int *maze[], int M, int n, int t)
Input Param 
     maze            迷宫布局(这里用二维数组实现布局)       
	 M               迷宫(数组)行数
     N               迷宫(数组)列数
	 T               公主能坚持的天数
Output Param 
                     无
Return Value
     0         可以救出公主
     -1        不可以救出公主

*/



#include<stdio.h> 
#include<string.h> 
#include<iostream>
using namespace std;


char map[22][22];
bool flg;

struct point
 {
	 int x;
	 int y;
 };

point p[4] = {{0, 1},{0, -1},{1, 0},{-1, 0}};

 void deep(point S, point P, int t)
 {
	 if(flg)
		 return;
	 if (map[S.x][S.y] == 'P')
	 {
		 flg = true;
		 return;
	 }
	 if (abs(S.x - P.x) + abs(S.y - P.y) > t)
		 return;
	 
	 for (int i = 0; i < 4; i++)
	 {
		 if ( map[S.x + p[i].x][S.y + p[i].y] != '*')
		{
			map[S.x][S.y] = '*';
			S.x = S.x + p[i].x;
			S.y = S.y + p[i].y;
			deep(S, P, t - 1);
			S.x = S.x - p[i].x;
			S.y = S.y - p[i].y;
			map[S.x][S.y] = '.';
		 }
	 }
 }

int SSavep(char *visited, int t, int n, int m)
{ 
	
	memset(map, '*', sizeof(char) * 22 * 22);
	flg = false;
	for (int i = 1; i <= m; i++)
	{
		for (int j = 1; j <= n; j++)
		{
			map[i][j] = *visited++;
		}
	}

	point S;
	point P;
	for (int i = 1; i <= m; i++)
	{
		for (int j = 1; j <= n; j++)
		{
			if (map[i][j] == 'S')
			{
				S.x = i;
				S.y = j;
			}if (map[i][j] == 'P')
			{
				P.x = i;
				P.y = j;
			}
		}
	}

	deep(S, P, t);
	if (flg)
		return 0;
	else
		return -1;
}  


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值