給乙個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作為乙個等待檢查的方...