题目描述
有一个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 0 0 5 5
输出
23
Wrong_CODE:
#include <iostream>
using namespace std;
int map[8][8];
bool visited[8][8];
int res = 0x3f3f3f3f;
int dir[4][2] = { { 1, 0},
{-1, 0},
{ 0, -1},
{ 0, 1} };
int s_x, s_y, t_x, t_y;
void dfs(int x, int y, int val, int state) {
//搜索结束
if (x == t_x && y == t_y) {
if (val <= res) res = val;
//cout<<'hhh';
return;
}
//剪枝
if (val >= res) {
return;
}
if (visited[x][y]||map[x][y]==0)return;
visited[x][y] = true;
for (int i = 0; i < 4; i++) {
int new_x = x + dir[i][0];
int new_y = y + dir[i][1];
int cur_val = map[new_x][new_y] * state;
dfs(new_x, new_y, val + cur_val, cur_val % 4 + 1);
visited[new_x][new_y] = false;
}
}
int main() {
//8*8棋盘 保证最外围的一层都是0
for (int i = 1; i <= 6; i++) {
for (int j = 1; j <= 6; j++) {
cin >> map[i][j];
}
}
cin >> s_x >> s_y >> t_x >> t_y;
s_x++;
s_y++;
t_x++;
t_y++;
dfs(s_x, s_y, 0, 1);
cout << res;
}
AC_CODE:
#include<bits/stdc++.h>
using namespace std;
int mp[1000][1000];
int stx, sty, edx, edy;
int ans = 0x3f3f3f3f;
int dir[5]{-1,0,1,0,-1};
bool used[1000][1000];
void DFS(int x, int y,int statue,int ans_tmp)
{
if (ans_tmp > ans)return;
if (x == edx && y == edy)ans = ans_tmp;
for (int i = 0; i < 4; ++i)
{
int tmpx = x + dir[i];
int tmpy = y + dir[i + 1];
if (mp[tmpx][tmpy]&&!used[tmpx][tmpy])
{
used[tmpx][tmpy] = 1;
DFS(tmpx, tmpy,statue*mp[tmpx][tmpy]%4+1,ans_tmp+statue* mp[tmpx][tmpy]);
used[tmpx][tmpy] = 0;
}
}
}
int main()
{
for (int i = 1; i <= 6; ++i)
{
for (int j = 1; j <= 6; ++j)
{
cin>>mp[i][j];
}
}
cin >> stx >> sty >> edx >> edy;
++stx, ++sty, ++edx, ++edy;
used[stx][sty] = 1;
DFS(stx, sty,1,0);
cout << ans;
}
Perfect_Code:
#include<bits/stdc++.h>
using namespace std;
int mp[1000][1000];
int stx, sty, edx, edy;
int ans = 0x3f3f3f3f;
int dir[5]{-1,0,1,0,-1};
void DFS(int x, int y,int statue,int ans_tmp)
{
if (ans_tmp > ans)return;
if (x == edx && y == edy)ans = ans_tmp;
for (int i = 0; i < 4; ++i)
{
int tmpx = x + dir[i];
int tmpy = y + dir[i + 1];
if (mp[tmpx][tmpy])
{
int k = mp[tmpx][tmpy];
mp[tmpx][tmpy] = 0;
DFS(tmpx, tmpy,statue*k%4+1,ans_tmp+statue*k);
mp[tmpx][tmpy] = k;
}
}
}
int main()
{
for (int i = 1; i <= 6; ++i)
{
for (int j = 1; j <= 6; ++j)
{
cin>>mp[i][j];
}
}
cin >> stx >> sty >> edx >> edy;
++stx, ++sty, ++edx, ++edy;
mp[stx][sty] = 0;
DFS(stx, sty,1,0);
cout << ans;
}