A B很水就略了..
C.又是一次wannafly一样的判断区间的..... 边界设为2000000 正好GG...... fst的时候立马想到上次也是这么wa过的......
所以下次遇到这种题.... 边界还是 写INT_MIN 和 INT_MAX了
哈哈 写的时候 还是感觉蛮舒服的
D.每层烟花爆炸后沿与当前方向成45度的方向飞 经过t秒下一层爆炸 ..然后问到过的点的位置
最远的地方是150 等于300×300的图 那么我们 直接放在一个vis标记
再放一个 剪纸数组 n*8×300×300的mk数组 代表当前的地方烟花沿。。爆炸过没
DFS+剪纸 我们先把方向存起来 然后从最中央的地方开始爆炸....
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <vector>
#include <map>
#include <climits>
using namespace std;
typedef long long ll;
const int N = ;
const int p = ;
int dx[] = {-, -, , , , , , -};
int dy[] = {, -, -, -, , , , };
bool vis[N][N];
bool mk[][N][N][];
int n;
int t[N];
void dfs(int deep,int nowx,int nowy,int dir)
{
if(mk[deep][nowx][nowy][dir]||deep>=n) return ;
mk[deep][nowx][nowy][dir] = true;
for(int i=;i<t[deep];i++)
{
nowx+=dx[dir];
nowy+=dy[dir];
vis[nowx][nowy] = true;
}
dfs(deep+,nowx,nowy,(dir+)%);
dfs(deep+,nowx,nowy,(dir-+)%); }
int main()
{
scanf("%d",&n);
//t[0] = 0;
for(int i=;i<n;i++)
{
scanf("%d",t+i);
}
dfs(,p,p,);
int ans = ;
for(int i=;i<N;i++)
for(int j=;j<N;j++)
ans+=vis[i][j]?:;
cout<<ans<<endl;
return ;
}
AC代码
写起来也不是很难.... 当时真的是被吓怕的.......
E.