最優對稱路徑

2021-06-21 20:14:38 字數 1147 閱讀 1489

給乙個n行n列的網格,每個格仔裡有乙個1到9的數字。你需要從左上角走到右下角,其中每一步只能往上、下、左、右四個方向之一走到相鄰格仔,不能斜著走,也不能走出網格,但可以重複經過乙個格仔。為了美觀,你經過的路徑還必須關於「左下-右上」這條對角線對稱。你的任務是統計所有合法路徑中,數字之和最小的路徑有多少條。

這道題在學校oj上資料出得比較小,但對於我這種渣渣來說還是還是需要好好考慮的。

思路:網格的左上角和右下角同時往中間搜,搜到同乙個點,不過搜尋的時候注意對稱。

這個對稱是左上角的網格往右搜,那麼右下角的網格就往上搜;左上角的網格往下搜,那右下角的網格就往左搜;同理可知其它方向。

每搜尋出一條對稱路徑便比對是否最優。

因為可以重複經過乙個格仔,四個方向的搜尋就會出現無限搜尋的情況((1,1)→(1,2)→(1,1)→……等情況),這個問題卡了很久還是沒有好的解決方法。最終通過記錄路徑上數字之和來終止這種情況。

#include#includeusing namespace std;

int a[205][205];

int t;

long long mmin;

long long no=0;

void dfs(int a1,int b1,int a2,int b2,long long sum)

else

if(sum+a[a1][b1]0)

dfs(a1-1,b1,a2,b2+1,sum);

if(b1-1>0)

dfs(a1,b1-1,a2+1,b2,sum);}}

}int main()

{ int i,j;

while(1)

{cin>>t;

if(t==0) break;

memset(a,0,sizeof(a));

mmin=1000000009;

no=0;

for(i=1;i<=t;i++)

for(j=1;j<=t;j++) cin>>a[i][j];

dfs(1,1,t,t,0);

cout<

我暫時只能做到這了。

最優對稱路徑

湖南省第七屆大學生計算機程式設計競賽 the seventh hunan collegiate programming contest 題目g最優對稱路徑 給乙個n行n列的網格,每個格仔裡有乙個1到9的數字。你需要從左上角走到右下角,其中每一步只能往上 下 左 右四個方向之一走到相鄰格仔,不能斜著走...

1106 最優對稱路徑(最短路 記憶化搜尋)

submit page summary time limit 1 sec memory limit 128 mb submitted 486 solved 135 給乙個n行n列的網格,每個格仔裡有乙個1到9的數字。你需要從左上角走到右下角,其中每一步只能往上 下 左 右四個方向之一走到相鄰格仔,不...

A (最優路徑)

尋路 尋找最短路徑並避開障礙物 首先將地圖虛擬化,將地圖劃分為乙個乙個的小方塊,這樣可以用二維陣列來表示地圖。如下所示,綠色塊 a 是起點,紅色塊 b 是終點,中間藍色塊是障礙物,白色塊是空地。先羅列出所有的步驟,等會按照例子一步一步分析 1 尋路步驟 步驟1.從起點a開始,把a作為乙個等待檢查的方...