題目描述:
有乙個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...