南外c++集訓列舉題:關燈

e4ns發表於2024-07-12

根據標題可知 這道題一定是一道列舉題
這道題考慮使用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;
}

相關文章