描述
有一个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;
}