c 汽車加油行駛問題

2022-05-01 11:42:09 字數 1634 閱讀 3477

給定乙個 n*n 的方形網格,設其左上角為起點◎,座標為(1,1),x 軸向右為正,y軸向下為正,每個方格邊長為1。一輛汽車從起點◎出發駛向右下角終點▲,其座標為(n,n) 。在若干個網格交叉點處,設定了油庫,可供汽車在行駛途中加油。汽車在行駛過程中應遵守如下規則:

(1)汽車只能沿網格邊行駛,裝滿油後能行駛 k 條網格邊。出發時汽車已裝滿油,在起點與終點處不設油庫。

(2)汽車經過一條網格邊時,若其x 座標或 y 座標減小,則應付費用b,否則免付費用。

(3)汽車在行駛過程中遇油庫則應加滿油並付加油費用a。

(4)在需要時可在網格點處增設油庫,並付增設油庫費用c(不含加油費用a)。

(5)(1)~(4)中的各數n、k、a、b、c均為正整數,且滿足約束:2 <= n <= 100,2 <= k <= 10。

第一行是 n,k,a,b,c的值。第二行起是乙個 n*n 的 0-1 方陣,每行 n 個值,至 n+1 行結束。方陣的第 i 行第 j 列處的值為 1 表示在網格交叉點(i,j)處設定了乙個油庫,為0 時表示未設油庫。各行相鄰兩個數以空格分隔。

將最小費用輸出。

9 3 2 3 6  

0 0 0 0 1 0 0 0 0

0 0 0 1 0 1 1 0 0

1 0 1 0 0 0 0 1 0

0 0 0 0 0 1 0 0 1

1 0 0 1 0 0 1 0 0

0 1 0 0 0 0 0 1 0

0 0 0 0 1 0 0 0 1

1 0 0 1 0 0 0 1 0

0 1 0 0 0 0 0 0 0

12
(none)

#include #include using namespace std;

int n,k,a,b,c;

int g[101][101];

struct point

;int dx[4] = ;

int dy[4] = ;

int dm[4] = ;//dm是控制回走的時候是否收費

int f,e;

point q[7000000],s;

bool used[101][101][11];

int m[101][101][11];

int main()

}if (g[v.x][v.y]==0) //如果不是加油站

}v.ans+=a+c,v.o=k;//造加油站 付錢 重新計算可行駛的路程

if (used[v.x][v.y][v.o] == 0 || (used[v.x][v.y][v.o] == 1 && v.ans < m[v.x][v.y][v.o]))}}

}

int res = 1000000000;//把res設成最大,取最小值

for (int i = 0;i <= k ;i++)//重複計算

if (res > m[n][n][i] && m[n][n][i] != 0) res = m[n][n][i];//取最小值

cout << res << endl;//將最後乙個點的費用輸出(即最小費用)

return 0;

}

(未完待續)

汽車加油行駛問題

1.問題描述 給定乙個n n 的方形網格,設其左上角為起點,座標為 1,1 x 軸向右為正,y 軸 向下為正,每個方格邊長為1。一輛汽車從起點出發駛向右下角終點,其座標為 n,n 在若干個網格交叉點處,設定了油庫,可供汽車在行駛途中加油。汽車在行駛過程中應遵守 如下規則 1 汽車只能沿網格邊行駛,裝...

汽車加油行駛問題

給定乙個n n 的方形網格,設其左上角為起點 座標為 1,1 x 軸向右為正,y 軸向下為正,每個方格邊長為1,如圖所示。一輛汽車從起點 出發駛向右下角終點 其 座標為 n,n 在若干個網格交叉點處,設定了油庫,可供汽車在行駛途中加油。汽車在 行駛過程中應遵守如下規則 1 汽車只能沿網格邊行駛,裝滿...

P4009 汽車加油行駛問題

看了很多題解,無論什麼解法都繞不開分層圖 在本題中加滿油的車每次可以移動k步,那麼我們就可以建立乙個k 1層的分層圖,表示汽車油量k的狀態 油量0 k 然後根據題目要求建圖 首先我們規定 k從1開始 第k層第i行第j列點編號為 k 1 n n i 1 n j 首先我們從第k層 i,j 建立一條邊到第...