http://codeforces.com/contest/812/problem/B

【题意】

有一个n*m的棋盘,每个小格子有0或1两种状态,现在要把所有的1都变成0,问最少的步数是多少?初始位置在左下角,只有把下面一层的1都变成0后才可以到上一层,只有在每层的最右边和最左边可以向上走(up),否则只能左右移动(left or right)。只要经过1,就可以把1变成0,只要把最后一个1,就可以立即停止操作。

【Accepted】

 #include <iostream>
#include <stdio.h>
#include <cmath>
#include <vector>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <deque>
#include <stack>
#include <string>
#include <bitset>
#include <ctime>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m;
const int maxn=1e2+;
char s[maxn];
int a[][maxn];
int sum[];
int ans;
int fir[];
int sec[];
const int inf=0x3f3f3f3f;
int index;
void dfs(int cur,int flag,int cnt)
{
if(cur==index)
{
if(flag)
{
int t=cnt+sec[index]-;
ans=min(ans,t);
return;
}
else
{
int t=cnt+m+-fir[index];
ans=min(ans,t);
return;
}
}
if(flag)
{
if(sum[cur])
{
dfs(cur-,,cnt+m+);
dfs(cur-,,cnt+*(sec[cur]-)+);
}
else
{
dfs(cur-,,cnt+);
}
}
else
{
if(sum[cur])
{
dfs(cur-,,cnt+m+);
dfs(cur-,,cnt+*(m+-fir[cur])+);
}
else
{
dfs(cur-,,cnt+);
}
} }
int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(sum,,sizeof(sum));
memset(fir,-,sizeof(fir));
memset(sec,,sizeof(sec));
ans=inf;
for(int i=;i<=n;i++)
{
scanf("%s",s+);
for(int k=;k<=m+;k++)
{
a[i][k]=s[k]-'';
sum[i]+=a[i][k];
//每层最右的1的位置
if(a[i][k])
{
sec[i]=k;
}
//每层最左的1的位置
if(a[i][k]&&fir[i]==-)
{
fir[i]=k;
}
}
}
int cou=;
//index表示走到第几层为止,因为上面的都是0
index=;
for(int i=;i<=n;i++)
{
cou+=sum[i];
if(cou!=)
{
index=i;
break;
}
}
//特判,如果数据都是0
if(index==)
{
printf("0\n");
continue;
}
//分别表示第几层,当前层的初始位置在最左边还是最右边,步数
dfs(n,,);
cout<<ans<<endl;
}
return ;
}

DFS:2^15

时间复杂度是2^15

没有考虑的都是0的corner case,疯狂wa

【DFS】codeforces B. Sagheer, the Hausmeister的更多相关文章

  1. 【dfs】codeforces Journey

    http://codeforces.com/contest/839/problem/C [AC] #include<iostream> #include<cstdio> #in ...

  2. 【推导】【DFS】Codeforces Round #429 (Div. 1) B. Leha and another game about graph

    题意:给你一张图,给你每个点的权值,要么是-1,要么是1,要么是0.如果是-1就不用管,否则就要删除图中的某些边,使得该点的度数 mod 2等于该点的权值.让你输出一个留边的方案. 首先如果图内有-1 ...

  3. 【贪心】【DFS】Codeforces Round #403 (Div. 2, based on Technocup 2017 Finals) C. Andryusha and Colored Balloons

    从任意点出发,贪心染色即可. #include<cstdio> #include<algorithm> using namespace std; int v[200010< ...

  4. 【DFS】Codeforces Round #402 (Div. 2) B. Weird Rounding

    暴搜 #include<cstdio> #include<algorithm> using namespace std; int n,K,Div=1,a[21],m,ans=1 ...

  5. 【DFS】Codeforces Round #398 (Div. 2) C. Garland

    设sum是所有灯泡的亮度之和 有两种情况: 一种是存在结点U和V,U是V的祖先,并且U的子树权值和为sum/3*2,且U不是根,且V的子树权值和为sum/3. 另一种是存在结点U和V,他们之间没有祖先 ...

  6. 【第40套模拟题】【noip2011_mayan】解题报告【map】【数论】【dfs】

    目录:1.潜伏者 [map] 2.Hankson的趣味题[数论]3.mayan游戏[dfs] 题目: 1. 潜伏者(spy.pas/c/cpp)[问题描述]R 国和S 国正陷入战火之中,双方都互派间谍 ...

  7. Kattis - glitchbot 【DFS】

    Kattis - glitchbot [DFS] 题意 有一个机器人 刚开始在(0, 0),然后给出一个目标点,并且会给出一系列指令,但是其中会有一个指令是错误的.我们需要找出那个指令,并且改成正确的 ...

  8. 【题解】Codeforces 961G Partitions

    [题解]Codeforces 961G Partitions cf961G 好题啊哭了,但是如果没有不小心看了一下pdf后面一页的提示根本想不到 题意 已知\(U=\{w_i\}\),求: \[ \s ...

  9. HDU 6113 度度熊的01世界 【DFS】(2017"百度之星"程序设计大赛 - 初赛(A))

    度度熊的01世界 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

随机推荐

  1. C#基础学习3

    运算符,表达式!

  2. 【前端】jq弹出一个透明小提示窗,然后逐渐消失

      function show_main(content) { var showWindow = '<div id="show_main" style="borde ...

  3. requirejs&&springboot

    1.Spring Boot Spring boot 基础结构主要有三个文件夹: (1)src/main/java  程序开发以及主程序入口 (2)src/main/resources 配置文件 (3) ...

  4. Junit测试集锦

    Junit测试集锦 前言: 一个程序从设计很好的状态开始,随着新的功能不断地加入,程序逐渐地失去了原有的结构,最终变成了一团乱麻.所以在开发过程中,对于程序员来说,测试是非常重要的.言归正传,开始Ju ...

  5. SQLite-删除查询

    SQLite -删除查询 SQLite DELETE查询用于从一个表删除现有记录.您可以使用WHERE子句删除查询删除选定行,否则所有记录将被删除. 语法: 删除查询的WHERE子句的基本语法如下: ...

  6. VMware 彻底删除虚拟机操作系统的方法

    方法一 首先,都需要点击左边的虚拟机列表,选中你要删除的操作系统 点击VMwae上方的虚拟机-管理-从硬盘删除. 方法二 右键左侧列表中要删除的系统-移除. 然后在硬盘上找到其所在文件夹,直接按SHI ...

  7. upload 上传按钮组件 iview

    <!-- * @description 导入Excel * @fileName importExcel.vue * @author 彭成刚 * @date // :: * @version V1 ...

  8. this.treeData = JSON.parse(JSON.stringify(this.d)) 树的序列化反序列化

    this.treeData = JSON.parse(JSON.stringify(this.d))

  9. CAD交互绘制文字(网页版)

    在CAD设计时,需要绘制文字,用户可以设置设置绘制文字的高度等属性. 主要用到函数说明: _DMxDrawX::DrawText 绘制一个单行文字.详细说明如下: 参数 说明 DOUBLE dPosX ...

  10. jxcel - 好用的Excel与Java对象转换工具

    更多精彩博文,欢迎访问我的个人博客 Jxcel简介 Jxcel是一个支持Java对象与Excel(目前仅xlsx.xls)互相转换的工具包. 项目地址:https://github.com/jptan ...