codeforces 750D New Year and Fireworks【DFS】
题意:烟花绽放时分为n层,每层会前进ti格,当进入下一层是向左右45°分开前进。 问在网格中,有多少网格至少被烟花经过一次?
题解:最多30层,每层最多前进5格,烟花的活动半径最大为150,每一层的方向都可以由上一层决定,所以一定 小于300*300中情况,直接暴力绽放的过程就行了。bfs和dfs都可以做。
dfs:
#include<stdio.h>
#include<iostream>
#include<math.h>
#include<algorithm>
#include<string> typedef long long ll;
#define MAXN 100000
using namespace std; int n, a[35], m[305][305], vis[35][305][305][8];
//clockwise
int dx[8] = { 1, 1, 0, -1, -1, -1, 0, 1 };
int dy[8] = { 0, -1, -1, -1, 0, 1, 1, 1 }; void dfs(int cur, int x, int y, int dir)
{
if (cur == n || vis[cur][x][y][dir])
return;
vis[cur][x][y][dir] = m[x][y] = 1;
for (int i = 1; i < a[cur]; i++)
{
x += dx[dir];
y += dy[dir];
m[x][y] = 1;
}
int nd = (dir + 1) & 7;
dfs(cur + 1, x + dx[nd], y + dy[nd], nd);
nd = (dir + 7) & 7;
dfs(cur + 1, x + dx[nd], y + dy[nd], nd);
} int main()
{
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
dfs(0, 150, 150, 4);
int cnt = 0;
for (int i = 0; i < 305; i++)
{
for (int j = 0; j < 305; j++)
{
if (m[i][j])
cnt++;
}
}
cout << cnt << endl;
return 0;
}
bfs:
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn = 310;
int mark[maxn][maxn][32][6];
int n,a[32],map[maxn][maxn];
int asp[][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};
struct node
{
int x,y,cnt,dir; //cnt:烟花的层数 dir:烟花前进的方向
}temp; void bfs()
{
queue<node> q;
temp.x=150; temp.y=150; temp.cnt=1; temp.dir=0;
q.push(temp);
mark[150][150][1][0]=1;
while(!q.empty())
{
temp=q.front();
q.pop();
int nx=temp.x, ny=temp.y, num=temp.cnt, k=temp.dir;
for(int i=1;i<=a[num];++i)//当前层走的路径
{
nx+=asp[k][0];
ny+=asp[k][1];
map[nx][ny]=1;
}
if(num!=n)
{
int kl=(k-1+8)%8, kr=(k+1)%8;//当前烟花炸裂后,分开的两个子烟花前进的方向
temp.x=nx; temp.y=ny; temp.cnt=num+1;
if(!mark[nx][ny][num+1][kl])//kl左45°
{
mark[nx][ny][num+1][kl]=1;
temp.dir=kl;
q.push(temp);
}
if(!mark[nx][ny][num+1][kr])//kr右45°
{
mark[nx][ny][num+1][kr]=1;
temp.dir=kr;
q.push(temp);
}
}
}
int ans=0;
for(int i=0;i<=300;++i)
for(int j=0;j<=300;++j)
if(map[i][j])
ans++;
printf("%d\n",ans);
} int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(map,0,sizeof(map));
memset(mark,0,sizeof(mark));
for(int i=1;i<=n;++i)
scanf("%d",&a[i]);
bfs();
}
return 0;
}
codeforces 750D New Year and Fireworks【DFS】的更多相关文章
- Codeforces 445 A DZY Loves Chessboard【DFS】
题意:给出n*m的棋盘,在‘.’处放上B或者W,最后要求所有的B和W都不相邻 先把棋盘的点转化成‘B’,再搜,如果它的四周存在‘B’,则将它变成'W' 一直挂在第五个数据的原因是,没有dfs(nx,n ...
- Codeforces 475 B Strongly Connected City【DFS】
题意:给出n行m列的十字路口,<代表从东向西,>从西向东,v从北向南,^从南向北,问在任意一个十字路口是否都能走到其他任意的十字路口 四个方向搜,搜完之后,判断每个点能够访问的点的数目是否 ...
- Codeforces 510B Fox And Two Dots 【DFS】
好久好久,都没有写过搜索了,看了下最近在CF上有一道DFS水题 = = 数据量很小,爆搜一下也可以过 额外注意的就是防止往回搜索需要做一个判断. Source code: //#pragma comm ...
- 【dfs】codeforces Journey
http://codeforces.com/contest/839/problem/C [AC] #include<iostream> #include<cstdio> #in ...
- 【DFS】codeforces B. Sagheer, the Hausmeister
http://codeforces.com/contest/812/problem/B [题意] 有一个n*m的棋盘,每个小格子有0或1两种状态,现在要把所有的1都变成0,问最少的步数是多少?初始位置 ...
- 【第40套模拟题】【noip2011_mayan】解题报告【map】【数论】【dfs】
目录:1.潜伏者 [map] 2.Hankson的趣味题[数论]3.mayan游戏[dfs] 题目: 1. 潜伏者(spy.pas/c/cpp)[问题描述]R 国和S 国正陷入战火之中,双方都互派间谍 ...
- Kattis - glitchbot 【DFS】
Kattis - glitchbot [DFS] 题意 有一个机器人 刚开始在(0, 0),然后给出一个目标点,并且会给出一系列指令,但是其中会有一个指令是错误的.我们需要找出那个指令,并且改成正确的 ...
- HDU 6113 度度熊的01世界 【DFS】(2017"百度之星"程序设计大赛 - 初赛(A))
度度熊的01世界 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- 【dfs】P1331 海战
题目描述 在峰会期间,武装部队得处于高度戒备.警察将监视每一条大街,军队将保卫建筑物,领空将布满了F-2003飞机.此外,巡洋船只和舰队将被派去保护海岸线.不幸的是因为种种原因,国防海军部仅有很少的几 ...
随机推荐
- A+B (带有,的数字)
题目描述 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号","隔开. 现在请计算A+B的结果,并以正常形式输出. 输入描述: 输入包含多组数据数据,每组数据占一行,由 ...
- 16. Spring boot 错误页面
默认效果:1).浏览器,返回一个默认的错误页面 1.1 请求头 1.2返回结果 2).如果是其他客户端,默认响应一个json数据 2.1请求头 2.2返回结果 { "timestamp& ...
- mysql 案例 ~ pt修复工具的使用
简介:今天咱们来聊聊PT修复工具pt-table-sync 注意事项: 1 表要有主键或者唯一键 2 针对每一个chunk加的是for update锁 3 修复过程中不能容忍从库延迟 如果 ...
- js中获取时间new date()的用法和获取时间戳
获取时间: 1 var myDate = new Date();//获取系统当前时间 获取特定格式的时间: 1 myDate.getYear(); //获取当前年份(2位) 2 myDate.getF ...
- JS浮点数运算Bug的解决办法
方法一:重写浮点运算的函数 //除法函数,用来得到精确的除法结果 //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显.这个函数返回较为精确的除法结果. //调用:acc ...
- 404错误处理以及以后缀为action结尾的处理
--------------第一种是胡乱敲,后缀不是以action结尾,出现404错误-----------------------------
- C# 无法识别的消息版本。
问题:最近跟OA的java项目做审核接口,调用接口时提示"无法识别的消息版本.“ 解决:一直以为是协议不兼容,查了半天,最终发现是这个项目.net framework版本太低,升级为高版本即 ...
- windows环境变量PATH顺序的重要性
PATH是路径的意思,PATH环境变量中存放的值,就是一连串的路径.不同的路径之间,用英文的分号间隔开.系统在执行用户命令时,若用户未给出绝对路径,则首先在当前目录下寻找相应的可执行文件.批处理文件等 ...
- SharePoint 2010:搜索服务当前处于脱机状态
错误 搜索服务当前处于脱机状态.请访问 SharePoint 管理中心中的"服务器上的服务"页,以验证是否启用了该服务.这也可能是由于正在移动索引器所致. 正在配置网站集搜索关 ...
- 转载:编译安装Nginx(1.5.1)《深入理解Nginx》(陶辉)
原文:https://book.2cto.com/201304/19618.html 1.5 configure详解 可以看出,configure命令至关重要,下文将详细介绍如何使用configure ...