题面传送门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);
}
}
来源:CSDN
作者:acmgotoac
链接:https://blog.csdn.net/acmgotoac/article/details/104734864