http://codeforces.com/contest/750/problem/D

题目大意:

放鞭炮,鞭炮会爆炸n次,每次只会往目前前进方向的左上和右上放出他的子鞭炮。问,最后能有多少格子被覆盖?

思路:

感觉是期末复习阶段太久没有敲代码了的缘故吧,记忆化搜索的状态找的都不准确了。

bfs,然后定义dp(x,y,z,dir)表示在(x,y)这个位置,第z次爆炸,爆炸方向为dir。如果这个状态存在,就不放入队列。

//看看会不会爆int!数组会不会少了一维!
//取物问题一定要小心先手胜利的条件
#include <bits/stdc++.h>
using namespace std;
#pragma comment(linker,"/STACK:102400000,102400000")
#define LL long long
#define ALL(a) a.begin(), a.end()
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define haha printf("haha\n")
/*
定义:dp(x, y, t, dir = 8),当前在坐标(x, y)这个位置,朝向为dir,将要从这点开始走t步(假定,向上是+,向下是-.),是否走过这个状态
*/
const int maxpos = + ;
int dp[maxpos][maxpos][][];
int color[maxpos][maxpos];
int n;
int t[maxpos];
pair<int, int> dir[]; void init(){
cin >> n;
for (int i = ; i <= n; i++){
scanf("%d", t + i);
}
///逆时针标号
dir[] = mk(, ), dir[] = mk(, ), dir[] = mk(-, ), dir[] = mk(-, );
dir[] = mk(-, -), dir[] = mk(, -), dir[] = mk(, -), dir[] = mk(, );
} struct Point{
int x, y, aim;
}; int bfs(){
if (n == ) return t[];
t[n + ] = ;
int x = , y = ;
//dp[x][y + 1][t[1] - 1][1] = 1;
queue<Point> que;
for (int i = ; i <= t[]; i++){
int nx = dir[].fi + x, ny = dir[].se + y;
color[nx][ny] = ;
x = nx, y = ny;
}
//printf("x = %d y = %d\n", x, y);
que.push(Point{x, y, });
que.push(Point{x, y, });
dp[x][y][][] = ;
dp[x][y][][] = ;
for (int i = ; i <= n; i++){
queue<Point> tmp;
while (!que.empty()){
Point from = que.front(); que.pop();
//printf("%d %d\n", from.x, from.y);
for (int j = ; j <= t[i]; j++){
int nx = from.x + dir[from.aim].fi, ny = from.y + dir[from.aim].se;
color[nx][ny] = ;
from.x = nx, from.y = ny;
//printf("nx = %d ny = %d\n", nx, ny);
}
int lb = (from.aim + ) % , rb = (from.aim - + ) % ;
if (dp[from.x][from.y][i][lb] == ){
tmp.push(Point{from.x, from.y, lb});
dp[from.x][from.y][i][lb] = ;
}
if (dp[from.x][from.y][i][rb] == ){
tmp.push(Point{from.x, from.y, rb});
dp[from.x][from.y][i][rb] = ;
}
}
que = tmp;
}
int ans = ;
for (int i = ; i < ; i++){
for (int j = ; j < ; j++){
ans += color[i][j];
//if (color[i][j]) printf("x = %d y = %d\n", i, j);
}
}
return ans;
} int main(){
init();
printf("%d\n", bfs());
return ;
}

bfs或者dfs Good Bye 2016 D的更多相关文章

  1. HDU-4607 Park Visit bfs | DP | dfs

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 首先考虑找一条最长链长度k,如果m<=k+1,那么答案就是m.如果m>k+1,那么最 ...

  2. BFS和DFS详解

    BFS和DFS详解以及java实现 前言 图在算法世界中的重要地位是不言而喻的,曾经看到一篇Google的工程师写的一篇<Get that job at Google!>文章中说到面试官问 ...

  3. 算法录 之 BFS和DFS

    说一下BFS和DFS,这是个比较重要的概念,是很多很多算法的基础. 不过在说这个之前需要先说一下图和树,当然这里的图不是自拍的图片了,树也不是能结苹果的树了.这里要说的是图论和数学里面的概念. 以上概 ...

  4. hdu--1026--Ignatius and the Princess I(bfs搜索+dfs(打印路径))

    Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  5. 算法学习之BFS、DFS入门

    算法学习之BFS.DFS入门 0x1 问题描述 迷宫的最短路径 给定一个大小为N*M的迷宫.迷宫由通道和墙壁组成,每一步可以向相邻的上下左右四格的通道移动.请求出从起点到终点所需的最小步数.如果不能到 ...

  6. 【数据结构与算法】自己动手实现图的BFS和DFS(附完整源码)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/19617187 图的存储结构 本文的重点在于图的深度优先搜索(DFS)和广度优先搜索(BFS ...

  7. ACM__搜素之BFS与DFS

    BFS(Breadth_First_Search) DFS(Depth_First_Search) 拿图来说 BFS过程,以1为根节点,1与2,3相连,找到了2,3,继续搜2,2与4,相连,找到了4, ...

  8. BFS和DFS算法

    昨晚刚昨晚华为笔试题,用到了BFS和DFS,可惜自己学艺不精,忘记了实现原理,现在借用大佬写的内容给自己做个提高 转自:https://www.jianshu.com/p/70952b51f0c8 图 ...

  9. 通俗理解BFS和DFS,附基本模板

    1.BFS(宽度优先搜索):使用队列来保存未被检测的节点,按照宽度优先的顺序被访问和进出队列 打个比方:(1)类似于树的按层次遍历 (2)你的眼镜掉在了地上,你趴在地上,你总是先摸离你最近的地方,如果 ...

随机推荐

  1. kubernetes service分析

    service type k8s中service主要有三种: ClusterIP: use a cluster-internal IP only - this is the default and i ...

  2. ehcache.xml配置参数

    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLoc ...

  3. Nopcommerce架构浅谈之架构层次

    前面谈到了系统的文件,从文件结构中我们也可以看出Nop的层次划分还是非常清晰,下面我将介绍下Nop的架构层次,并对每个层做简要的介绍,先看我画的层次图. 这个系统基本上按照了ddd的形式做了划分,我本 ...

  4. 使用TypeScript开发ReactNative应用的简单示例

    最近小小尝试了下 ReactNative + TypeScript 开发APP,爬了无数坑之后总算弄出来个结果,重要的地方记录下,后面会附上示例代码: 1.开发工具的选择 windows 平台我接触的 ...

  5. Android便携式热点的开启状态检测和SSID的获取

    WIFI热点的开启状态和开启后的SSID如何获取呢? 打开WifiManager.java源码,可找到 getWifiApState() 方法,惊喜的发现直接调用这个方法就能获取到热点的状态,然而在调 ...

  6. svg动画学习

    首先我们定义一块画布,然后在上面画一个圆形. 他看起来应该是这个样子的:(每一个实例我都会附加图片以及demo链接,方便直观的理解与源代码的查看,查看的时候请使用标准浏览器) 点击查看Demo 现在我 ...

  7. centos6.4、6.5、7.0环境下载及安装

    centos6.4.6.5.7.0下载地址: http://www.cnblogs.com/zhwl/p/3657958.html或 http://www.linuxdown.net/CentOS/2 ...

  8. 用js使得输入框input只能输入数字

        JS判断只能是数字和小数点1.文本框只能输入数字代码(小数点也不能输入)<input onkeyup="this.value=this.value.replace(/\D/g, ...

  9. [UWP小白日记-7]转换MVA学院的XML字幕为SRT (二)

    瞎扯淡 上个版本,非常蠢用来N多的循环导致非常卡性能烂得不行,这次使用XmlDocument类来读取XML字幕 其实根本不用各种扒XML字幕,好吧我这是学习使用XmlDocument类,嗯就是这个样子 ...

  10. Oracle SQL 基本操作之 用户权限管理方法

     Oracle SQL 基本操作之 用户权限管理方法 最近把有关用户操作和权限管理的东西整理了一下,虽然不少博客都有过类似的整理,但是自己发现他们的内容或多或少都有些错误.于是,本人亲自对每条语句进行 ...