九度 1091 棋盤遊戲

2021-08-07 23:32:06 字數 1520 閱讀 3466

題目描述:

有乙個6*6的棋盤,每個棋盤上都有乙個數值,現在又乙個起始位置和終止位置,請找出乙個從起始位置到終止位置代價最小的路徑:

1、只能沿上下左右四個方向移動

2、總代價是沒走一步的代價之和

3、每步(從a,b到c,d)的代價是c,d上的值與其在a,b上的狀態的乘積

4、初始狀態為1

每走一步,狀態按如下公式變化:(走這步的代價%4)+1。

輸入

第一行有乙個正整數n,表示有n組資料。

每組資料一開始為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解題思路:

用bfs和dfs都可以,就是需要注意剪枝,否則搜尋空間過大。

ac**:

#include 

#include

#define len 6

using

namespace

std;

int n;

int dat[len][len], opt[len][len][4];

int movex[4] = , movey[4] = ;

struct nodestart, end;

bool isok(node n, int type)

int findpath(node a, node b)

for(int i = 0; i < 4; i++);

int tmpcost = n.value * dat[tmp.x][tmp.y];

tmp.value = tmpcost % 4 + 1;

tmp.cost = n.cost + tmpcost;

if(tmp.cost < opt[b.x][b.y][tmp.value-1] && tmp.cost < opt[tmp.x][tmp.y][tmp.value-1]) }}

}return min;

}int main()}}

scanf("%d%d%d%d", &start.x, &start.y, &end.x, &end.y);

start.value = 1;

start.cost = 0;

printf("%d\n", findpath(start, end));}}

fclose(stdin);

return

0;}

參考鏈結

九度OJ 1091棋盤遊戲

有乙個6 6的棋盤,每個棋盤上都有乙個數值,現在又乙個起始位置和終止位置,請找出乙個從起始位置到終止位置代價最小的路徑 1 只能沿上下左右四個方向移動 2 總代價是沒走一步的代價之和 3 每步 從a,b到c,d 的代價是c,d上的值與其在a,b上的狀態的乘積 4 初始狀態為1 每走一步,狀態按如下公...

DFS和BFS 解棋盤遊戲(九度OJ 1091)

dfs利用遞迴,不必使用多餘的資料結構,實現簡單。但要注意剪枝。bfs借助佇列,往往在求最優解時使用。總是能找到最優解,某些情況下也要剪枝。這兩種方法根據具體問題來使用。以此題為例,dfs和bfs都可求解。由於是求最優解,用bfs更為直接。由於此題的不確定性,必須要考慮所有可能情況,結合剪枝。題目1...

OJ 1091 棋盤遊戲

include using namespace std const int n 6 const int d 4 const int inf 100000000 int direct 4 2 右,左,上,下 int g n n int visit n n int mincost 0 bool chec...