首页 > 代码库 > CodeForce-812B Sagheer, the Hausmeister(DFS)
CodeForce-812B Sagheer, the Hausmeister(DFS)
Sagheer, the Hausmeister
CodeForces - 812B
题意:有一栋楼房,里面有很多盏灯没关,为了节约用电小L决定把这些灯都关了。
这楼有 n 层,最左边和最右边有楼梯。每一层有 m 个房间排成一排。这栋楼可以被表示成一个 n 行 m?+?2 列的矩阵,其中每行第一个和最后一个格点表示楼梯, 剩余 m 个格点表示房间。
现在小L在最底层的最左边楼梯,他想要关掉所有的灯。他每次可以走到相邻的房间,如果在楼梯口可以上下楼梯。他打算关掉所有开着的灯,在他没有将一层的所有灯都关闭前他不会上楼。现在求他最少需要走多少步可以关闭所有灯。
注意小L不需要返回原处,最终可以停留在任意一个地方。
直接dfs所有的状态:
#include<iostream> #include<cstdio> #include<string> #include<algorithm> using namespace std; int n,m; char mapp[20][110]; int dfs(int cnt,int pos,int temp)//cnt表示楼层,pos表示是哪边的楼梯,temp表示的是上楼要走多少步 { if(cnt<0) return 0; int ans=0; if(pos) { for(int i=m+2;i>=0;i--) { if(mapp[cnt][i]==‘1‘) { ans+=pos-i+temp; pos=i; temp=0; } } } else { for(int i=0;i<m+2;i++) { if(mapp[cnt][i]==‘1‘) { ans+=i-pos+temp; pos=i; temp=0; } } } ans+=min(dfs(cnt-1,0,temp+pos+1),dfs(cnt-1,m+1,temp+m+2-pos)); return ans; } int main() { cin.sync_with_stdio(false); while (cin >> n >> m) { for (int i = 0; i < n; i++) { for (int j = 0; j < m + 2; j++) { cin >> mapp[i][j]; } } cout << dfs(n-1,0,0) << endl; } return 0; }
CodeForce-812B Sagheer, the Hausmeister(DFS)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。