南外c++集训枚举题:关灯

根据标题可知 这道题一定是一道枚举题
这道题考虑使用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;
}
posted @ 2024-07-12 23:09  e4ns  阅读(16)  评论(0)    收藏  举报