文章

10

粉丝

143

获赞

3

访问

55.5k

头像
DFS剪枝
P1277 上海交通大学机试题
发布于2022年2月23日 23:32
阅读数 4.8k

思路:本题考虑用搜索,以起点为树根,dfs遍历所有点,在适当的条件下剪枝。

剪枝条件:当前路径的代价总和sum大于目前已知的到终点的最小代价ans时,即可剪枝

ans更新条件:到达终点且sum更小时,更新ans。

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

int ans=1e9;//ans暂存当前能到达终点的搜索路径的代价最小值
int map[6][6];//存棋盘
bool visit[6][6];//存储每个位置是否被搜索过
int startx,starty,endx,endy;
int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};//上下左右四个移动方向
void dfs(int x,int y,int sum,int status)//sum暂存当前搜索路径的代价值,status存储上一结点的状态值
{
    if(sum<ans)//剪枝条件:若sum>ans则剪枝
    {
        if(x==endx&&y==endy)//若当前搜索路径走到终点,则更新ans的值
        {
            ans=sum;
            return ;
        }

        for(int i=0;i<4;i++)
        {
            int tempx=x+dir[i][0];
            int tempy=y+dir[i][1];
            if(!visit[tempx][tempy]&&tempx>=0&&tempx<6&&tempy>=0&&tempy<6)
            {
                int cost=status*map[tempx][tempy];
                int sum2=cost+sum;
...
登录查看完整内容


登录后发布评论

1 条评论
GlaucusD VIP
2024年3月13日 11:08

26行是不是应该先检查tempx & tempy 是否合法再检查这个点是否被访问,不然可能越界。 tempx>=0&&tempx<6&&tempy>=0&&tempy<6 !visit[tempx][tempy]. 要是前面的四个表达式其中一个不成立就不会执行!visit[tempx][tempy]。

赞(0)