dfs利用遞迴,不必使用多餘的資料結構,實現簡單。但要注意剪枝。
bfs借助佇列,往往在求最優解時使用。總是能找到最優解,某些情況下也要剪枝。
這兩種方法根據具體問題來使用。
以此題為例,dfs和bfs都可求解。
由於是求最優解,用bfs更為直接。
由於此題的不確定性,必須要考慮所有可能情況,結合剪枝。
題目1091:棋盤遊戲
時間限制:1 秒
記憶體限制:32 兆
特殊判題:否
提交:616
解決:151
題目描述:有乙個6*6的棋盤,每個棋盤上都有乙個數值,現在又乙個起始位置和終止位置,請找出乙個從起始位置到終止位置代價最小的路徑:
1、只能沿上下左右四個方向移動
2、總代價是沒走一步的代價之和
3、每步(從a,b到c,d)的代價是c,d上的值與其在a,b上的狀態的乘積
4、初始狀態為1
每走一步,狀態按如下公式變化:(走這步的代價%4)+1。
輸入:第一行有乙個正整數n,表示有n組資料。
每組資料一開始為6*6的矩陣,矩陣的值為大於等於1小於等於10的值,然後四個整數表示起始座標和終止座標。
輸出:輸出最小代價。
樣例輸入:
11 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**:
#include #include using namespace std;
struct node
;int ans;
int map[6][6];
int opt[6][6][4]; //記錄最優解,剪枝條件。4中狀態都要記錄
node start;
int ex, ey;
int cnt = 0;
int dir[4][2] = ,,, };
queueq;
void bfs(node n)
}} }
}int main()
start.sum = 0;
start.statu = 1;
ans = 100000;
cin >> start.x >> start.y >> ex >> ey;
bfs(start);
for (int i = 0; i < 4; i++)
//cout << cnt << endl;
cout << ans << endl;
} return 0;
}
language: c++
result: accepted
time:10 ms
memory:1516 kb
dfs**;
#include using namespace std;
int map[6][6];
int sx,sy,ex,ey,ans;
int cnt = 0;
int dir[4][2] = ,,, };
bool visit[6][6];
void dfs(int x,int y,int sum,int statu)
for(int i=0; i<4; i++)}}
}int main()
cin >> sx >> sy >> ex >> ey;
ans = 1000000;
dfs(sx,sy,0,1);
//cout << cnt << endl;
cout << ans << endl;
}return 0;
}
language: c++
result: accepted
time:10 ms
memory:1512 kb
九度 1091 棋盤遊戲
題目描述 有乙個6 6的棋盤,每個棋盤上都有乙個數值,現在又乙個起始位置和終止位置,請找出乙個從起始位置到終止位置代價最小的路徑 1 只能沿上下左右四個方向移動 2 總代價是沒走一步的代價之和 3 每步 從a,b到c,d 的代價是c,d上的值與其在a,b上的狀態的乘積 4 初始狀態為1 每走一步,狀...
九度OJ 1091棋盤遊戲
有乙個6 6的棋盤,每個棋盤上都有乙個數值,現在又乙個起始位置和終止位置,請找出乙個從起始位置到終止位置代價最小的路徑 1 只能沿上下左右四個方向移動 2 總代價是沒走一步的代價之和 3 每步 從a,b到c,d 的代價是c,d上的值與其在a,b上的狀態的乘積 4 初始狀態為1 每走一步,狀態按如下公...
DFS和BFS的複雜度和其他習題
3.若將n個頂點e條弧的有向圖採用鄰接表儲存,則拓撲排序演算法的時間複雜度為o n e 4.g是乙個非連通無向圖,共有22條邊,則該圖至少有 9 個頂點。全連通圖的定點 n 和邊數 m 滿足 m n n 1 2,那麼邊 m 22 時,圖 g n n 1 2 22 解得 n 8 而且,當 n 7 時,...