牛客网考研复试题——棋盘游戏

题目描述

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

猜你喜欢

转载自blog.csdn.net/qq_31741481/article/details/84584879
今日推荐