1. 程式人生 > >CodeForce-812B Sagheer, the Hausmeister(DFS)

CodeForce-812B Sagheer, the Hausmeister(DFS)

節約用電 可以關閉 div container 決定 class style dfs tar

Sagheer, the Hausmeister

CodeForces - 812B

題意:有一棟樓房,裏面有很多盞燈沒關,為了節約用電小L決定把這些燈都關了。

這樓有 n 層,最左邊和最右邊有樓梯。每一層有 m 個房間排成一排。這棟樓可以被表示成一個 nm?+?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)