POJ 3009 DFS

£可爱£侵袭症+ 提交于 2020-03-08 18:06:46

题面传送门http://poj.org/problem?id=3009

要点:1.石头会停止于障碍物前或者终点处(即便终点后没有障碍物也会算成功)

            2.石头扔出边界没有障碍物则会失败

            3.扔石头次数超过10次会失败

开始用BFS写的代码,会超内存,因为要存储每一个状态下的地图。

以下附上DFS代码:

#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 25;
int mapp[maxn][maxn];
int w[2];                      //h w
int dir[2] = {-1, 1};
int s[2];//起点
int e[2];//终点
int v;//最短路值
void DFS(int i, int j, int k)
{
	if(k > 10) return ; //限制次数
	if(i == e[0] && j == e[1])
	{
		if (v == -1) v = k;
		else if(k < v) v = k;
	}
	else
	{
	int pos[2];
	pos[0] = i;
	pos[1] = j;
	for(int x = 0; x < 2; x++)
	{
		for(int y = 0; y < 2; y++)
		{
			int d[2];
			d[0] = pos[0];
			d[1] = pos[1];
			int tar = 0;
			while( (d[x] + dir[y]) >= 0 && (d[x] + dir[y]) < w[x] )
			{
				d[x] = d[x] + dir[y];
				if(mapp[d[0]][d[1]] == 1)   //撞墙
				{
					if(tar)                 //不是相邻的墙
					{
						mapp[d[0]][d[1]] = 0;
						d[x] = d[x] - dir[y];
						DFS(d[0],d[1],k + 1);
						d[x] = d[x] + dir[y];
						mapp[d[0]][d[1]] = 1;
					}
					break;
				}
				if(d[0] == e[0] && d[1] == e[1]) //经过终点
				{
						DFS(d[0],d[1],k + 1);
					    break;             //不用继续移动
				}
				tar = 1;
			}
		}
	}
	}
}




int main()
{
	while(1)
	{
		scanf("%d %d", w + 1, w);
		if(!w[0] && !w[1]) break;
		for (int i = 0; i < w[0]; i ++)
		{
				for( int j = 0; j < w[1]; j++)
				{
					scanf("%d", &mapp[i][j]);
					if(mapp[i][j] == 2)
					{
						s[0] = i;
						s[1] = j;
						mapp[i][j] = 0;
					}
					if(mapp[i][j] == 3)
					{
						e[0] = i;
						e[1] = j;
						mapp[i][j] = 0;
					}
				}
		}
		v = -1;
		DFS(s[0], s[1], 0);
		printf("%d\n",v);
	}
}

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!