题目大意就是给出一个w*h的地图,其中0代表空地,1代表障碍物,2代表起点,3代表终点,每次行动可以走多个方格,每次只能向附近一格不是障碍物的方向行动,直到碰到障碍物才停下来,此时障碍物也会随之消失,如果行动时超出方格的界限或行动次数超过了10则会game over .如果行动时经过3则会win,记下此时行动次数(不是行动的方格数),求最小的行动次数
由于题目相对较长,所以分的情况也比较多,注意不要漏掉了!
1.起点是没有障碍的,当做0的情况。
2.注意区分冰壶是运动的还是静止的,若是静止的话,旁边有障碍是不能走的。没有的话冰壶是停在障碍旁边而不是取代障碍,这是障碍消失,若是运动的话,它的运动方向是不能改变的。
3.注意坐标系的建立(我觉得两个坐标轴好像是反的,反正纠结了很久)。
4.还有什么只能移动十次,不能出界等等。考虑了这些,基本就能过了。
数据1: 3 2 可知起点的旁边是终点,故可以只需一步就到达终点
数据2:
1 0 0 2 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0
1 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 3 0 0 0 0 0 3 0 0 0 0 0 3 0 2 0 0 0 3 0 0 0 0 0 3/2
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 1 可以这样移动 1 0 0 2 0 1 - > 0 2 0 0 0 1 -> 0 0 0 0 0 1 -> 0 0 0 0 0 1
0 1 1 1 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1
故可以最小四步到达3
数据3:1 1 2 1 1 3 因为2的旁边都是障碍物,而能移动的条件是该方向附近一格无障碍物,所以2无路可走,故无法到达3,无解
其他数据的分析类似
由于题目给出要在10步内找到最优解,又每次可以向四个方向进行搜索,时间复杂度是O(4^10)=O((2^10)^2)=O(1000^2)=O(1000000)
在搜索时如果发现此时搜索的层次已经大于最优解,则可以回溯,因为继续向下搜也不会再出现更优解。
该开始的时候题目没看清,把输入长高高反了,WA了两次,最后终于发现了,下面是做题情况
不说了代码如下:
#include<iostream>
#include<queue>
using namespace std;
struct point
{
int x,y;
int step;
};
int flag[45][45];
char map[45][45];
int dir1[4][2]={{0,-1},{1,0},{0,1},{-1,0}};//zuo优先
int dir2[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//you优先
int d1,d2;
int start[2];
int end[2];
int w,h;
void init()
{
memset(flag,0,sizeof(flag));
cin>>w>>h;
for(int i=0;i<h;i++)
{
cin>>map[i];
for(int j=0;j<w;j++)
{
if(map[i][j]=='#')
{
flag[i][j]=1;
}
if(map[i][j]=='S')
{
start[0]=i;
start[1]=j;
}
if(map[i][j]=='E')
{
end[0]=i;
end[1]=j;
}
}
}
if(start[0]==0)
{
d1=1;
d2=1;
}
else if(start[0]==h-1)
{
d1=3;
d2=3;
}
else if(start[1]==w-1)
{
d1=2;
d2=0;
}
else
{
d1=0;
d2=2;
}
}
int dfs(int x,int y,int d,int dir[][2])
{
int step ,temp, tempx,tempy;
if(x==end[0]&&y==end[1])
return 1;
for(int i=0;i<4;i++)
{
temp=(d+i)%4;
tempx=x+dir[temp][1];
tempy=y+dir[temp][0];
if(tempx>=0&&tempx<h&&tempy>=0&&tempy<w&&!flag[tempx][tempy])
break;
}
step=dfs(tempx,tempy,(temp+3)%4,dir)+1;
return step;
}
int bfs()
{
memset(flag,0,sizeof(flag));
queue<point> q;
point p;
p.x=start[0];
p.y=start[1];
p.step=1;
flag[p.x][p.y]=1;
q.push(p);
while(!q.empty())
{
p=q.front();
q.pop();
if(p.x==end[0]&&p.y==end[1])
return p.step;
for(int i=0;i<4;i++)
{
point temp;
temp.x=p.x+dir1[i][1];
temp.y=p.y+dir1[i][0];
if(temp.x>=0&&temp.x<h&&temp.y>=0&&temp.y<w&&map[temp.x][temp.y]!='#'&&!flag[temp.x][temp.y])
{
flag[temp.x][temp.y]=1;
temp.step=p.step+1;
q.push(temp);
}
}
}
return 0;
}
int main()
{
int T;
cin>>T;
while(T--)
{
init();
cout<<dfs(start[0],start[1],d1,dir1)<<" ";
cout<<dfs(start[0],start[1],d2,dir2)<<" ";
cout<<bfs()<<endl;
}
}
关于DFS一般都会与回溯相结合起来,这方面自己有一点理解,但是还不是那么懂,有待学习!!
分享到:
相关推荐
北京大学在线编程平台上的POJ3009题目名为"Curling 2.0",它是一道涉及到算法与数据结构的复杂问题,主要考察了参赛者对深度优先搜索(DFS)、向量(Vector)操作、回溯法以及剪枝策略的掌握程度。本题的解决方案...
在给出的文件列表中,“POJ1014-Dividing【多重背包+二进制优化】.cpp”和“POJ1014-Dividing【DFS】.cpp”很可能是两份不同的C++代码实现,分别展示了如何结合多重背包和二进制优化以及如何利用DFS来解决问题。...
标题“POJ3373-Changing Digits【DFS+强剪枝】”涉及的是一个编程竞赛中的问题,这个问题在北大POJ(北京大学在线评测系统)平台上被提出。"Changing Digits"是一个算法挑战,而解决方案是通过深度优先搜索(DFS)...
"POJ1321棋盘问题" ...POJ1321棋盘问题是一种经典的回溯法问题,通过使用DFS深度搜索和回溯法可以解决该问题。该问题可以帮助我们更好地理解回溯法和DFS算法,并且可以应用于解决其他类似的 Problem。
总的来说,解决"POJ3733-Changing Digits"这样的问题需要深入理解DFS算法,灵活运用强剪枝策略,以及具备良好的编程技巧。通过阅读解题报告和代码,可以学习如何将这些理论知识应用到实际问题中,提升算法设计和编程...
3. 在DFS过程中,可以采用回溯法,当发现当前分割无法满足条件时,回溯到上一步,尝试其他分割方案。 4. 为了优化搜索,可能还需要结合剪枝策略,提前剔除明显不可能满足条件的分支,以减少计算量。 总的来说,解这...
在题目"POJ2197"中,虽然具体细节没有给出,但可以推测这可能是一个需要寻找特定路径或者解的问题,要求参赛者编写程序利用DFS和回溯来找出符合条件的解。可能的情况包括但不限于寻找图中的所有简单路径、找到满足...
dfs中的回溯法,poj2488骑士游历,主要是回溯要将所有的点都遍历到。
3. **回溯法**:DFS在解决数独时实际上就是回溯法的应用,当遍历到某个位置无法找到合适的数字时,需要回溯到上一个位置,尝试其他可能的数字。 4. **状态转移**:在数独问题中,每个单元格的状态(已填数字或为空...
标题中的“poj2488.rar_poj24_poj2488_方向模板...综上所述,解决POJ2488问题的关键在于理解和运用回溯法,特别是深度优先搜索过程中的方向控制。通过分析提供的代码,我们可以深入学习如何在实际编程中实施这些概念。
常用的搜索算法有深度优先搜索(DFS)、广度优先搜索(BFS)、贪心算法、回溯算法等。 **重要性**:搜索算法是解决许多复杂问题的有效手段。例如,在游戏AI、路径规划等领域有着广泛的应用。 **示例题目**: - POJ...
DFS用于遍历或搜索树或图,从一个节点开始,沿着某条路径深入探索,直到达到最深处,然后回溯到未完全探索的节点继续进行。 3. **状态转移**:蚂蚁在空间中移动可能涉及到状态的转换,比如蚂蚁从一个节点移动到另一...
可能涉及的经典算法有分治策略、贪心算法、回溯法、动态规划、图算法(如DFS、BFS、最短路径算法)等。每个子文件中的代码都是对特定问题的算法实现。 4. 数据结构:有效的数据结构是解决问题的关键。常见数据结构...
6. **回溯法**:当问题具有很多解且可以通过逐步尝试排除无效解时,回溯法是一种常用的策略。 7. **状态压缩**:对于大棋盘,可以用位运算进行状态压缩,以节省空间。 由于没有具体的题目描述,以上只是根据一般...
解决这个问题通常采用深度优先搜索(DFS)或广度优先搜索(BFS),同时维护两个数组,分别记录边的最小度和边的出现顺序,以此来判断边是否为桥。 2. poj1150 "Gardening"(园艺) 这个题目要求你在一块矩形土地上...
深度优先搜索(Deep First Search, DFS)和广度优先搜索(Breadth First Search, BFS)是图论和树结构中常见的搜索策略,DFS常用于遍历或搜索树或图,而BFS则用于寻找最短路径等问题。 现在,让我们逐个分析压缩包中的...
这道问题主要涉及图论中的深度优先搜索(DFS)算法和位运算的应用,是一道典型的组合优化问题。 题目描述了飞行员兄弟有一台冰箱,里面存放了一些食物,每个食物都有一个重量和一个价值。现在他们面临着一个问题:...
这是一个典型的图搜索问题,常见的解决方法包括深度优先搜索(DFS)、广度优先搜索(BFS)以及A*搜索算法。 在八数码问题中,我们需要定义数据结构来表示当前的状态,通常是一个9个元素的一维数组,其中0代表空白...
可以采用回溯法或深度优先搜索(DFS)策略,结合递归实现全排列的生成。 6. 题目1040《Tic Tac Toe》:此题是关于井字游戏的判断,考察博弈论和状态空间搜索。通过分析游戏状态并使用深度优先搜索或最小最大搜索...
2. **搜索算法**:包括深度优先搜索(DFS)和广度优先搜索(BFS),在解决迷宫问题、树遍历和图遍历问题时非常有用。 3. **图论算法**:如最短路径算法(Dijkstra、Floyd-Warshall)、最小生成树(Prim、Kruskal)...