根據標題可知 這道題一定是一道列舉題
這道題考慮使用dfs,處理特殊處理第一層,每次加答案時選最優值。
給出程式碼:
點選檢視程式碼
#include<bits/stdc++.h>
using namespace std;
int n,m;
char mat[20][110];
int dfs(int cnt,int pos,int tmp)//cnt:樓層pos:哪裡的樓梯tmp走到樓梯的步數
{
if(cnt<0)
return 0;
int ans=0;
if(pos)
{
for(int i=m+2;i>=0;i--)
{
if(mat[cnt][i]=='1')
{
ans+=pos-i+tmp;//計算
pos=i;
tmp=0;
}
}
}
else
{
for(int i=0;i<m+2;i++)
{
if(mat[cnt][i]=='1')
{
ans+=i-pos+tmp;//計算
pos=i;
tmp=0;
}
}
}
ans+=min(dfs(cnt-1,0,tmp+pos+1),dfs(cnt-1,m+1,tmp+m+2-pos));//兩邊樓梯,兩種情況取小
return ans;//返回
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
while(cin>>n>>m)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<m+2;j++)
{
cin>>mat[i][j];
}
}
cout<<dfs(n-1,0,0)<<endl;
}
return 0;
}