棋盘游戏——动态规划、深度遍历

文章描述了一种算法,利用深度遍历策略在给定的6x6棋盘上找到从起始点到终止点的最小代价路径,每步代价由当前位置和状态决定。代码展示了如何通过递归和访问数组来实现这一过程。
摘要由CSDN通过智能技术生成

描述

    有一个6*6的棋盘,每个棋盘上都有一个数值,现在又一个起始位置和终止位置,请找出一个从起始位置到终止位置代价最小的路径:     1、只能沿上下左右四个方向移动     2、总代价是没走一步的代价之和     3、每步(从a,b到c,d)的代价是c,d上的值与其在a,b上的状态的乘积     4、初始状态为1     每走一步,状态按如下公式变化:(走这步的代价%4)+1。

输入描述:

    每组数据一开始为6*6的矩阵,矩阵的值为大于等于1小于等于10的值,然后四个整数表示起始坐标和终止坐标。

输出描述:

    输出最小代价。

示例1

输入:

1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
0 0 5 5

输出:

23

解题思路:

(1)采用深度遍历思想;

(2)考虑每个方向走法,并判断临界值;

(3)设置访问数组,记录已访问位置,后面要回溯置为0;

代码:

#include <algorithm>
#include <cstring>
#include <limits.h>  //最值;result初始化
#include <iostream>
using namespace std;

int number[6][6];   //棋盘中的数值
int visit[6][6];   //记录是否已访问
int sx,sy,ex,ey;  //开始和最终坐标
int result;  //最终结果
int dx[4]={0,0,1,-1}; //移动方向
int dy[4]={1,-1,0,0};

void dfs(int numx,int numy,int state,int cost){//(当前x位置,当前y位置,走到该位置状态,走到该位置总代价)
    int newx,newy,nowcost;

    if(numx==ex&&numy==ey){  //到达终止位置
        result=min(result, cost);  //找最小的
    }
    else{
        visit[numx][numy]=1;  //设置已访问该位置
        for(int i=0;i<4;i++){
            newx=numx+dx[i];  //新的x坐标值
            newy=numy+dy[i];  //新的y坐标值

            if(newx>=6||newy>=6||newx<0||newy<0){  //边界检测
                continue;
            }

            if(visit[newx][newy]==0){ //如果该位置未访问
                nowcost=number[newx][newy]*state;  //走这步的代价
                dfs(newx, newy, (nowcost%4)+1, cost+nowcost);  //递归深度遍历
            }
        }
        visit[numx][numy]=0;  //回溯
    }

}

int main() {
    memset(visit, 0, sizeof(visit));  //初始化vistt数组
    result=INT_MAX; //初始化结果为最大值;
    for(int i=0;i<6;i++){
        for(int j=0;j<6;j++){
            cin>>number[i][j];
        }
    }
    cin>>sx>>sy>>ex>>ey;
    dfs(sx,sy, 1, 0);
    cout<<result;
    return 0;

}

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值