题意:放烟花,烟花可以爆照n次,每次会分成2个,问最后有多少格子被照亮,看提示即可。
因为深度最大为30,每层做多照亮5个格子,所以就150,开数组为300即可。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
bool map[305][305][30][8];//bool型
int vis[305][305];
int nx[8]={0,-1,-1,-1,0,1,1,1};//8个方向
int ny[8]={1,1,0,-1,-1,-1,0,1};
int a[40],n;
void DFS(int x,int y,int dir,int deep)
{
if(deep>n||map[x][y][deep][dir]) return; //如果深度大于n或在那一个格子之前走过,且为同一个方向和深度
map[x][y][deep][dir]=1;
for(int i=1;i<=a[deep];i++){
x+=nx[dir]; y+=ny[dir];
vis[x][y]=1;
}
DFS(x,y,(dir+1)%8,deep+1);
DFS(x,y,(dir+7)%8,deep+1);
}
int main()
{
scanf("%d",&n);
memset(map,0,sizeof(map));
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
DFS(150,150,2,1);
int ans=0;
for(int i=0;i<=300;i++)
for(int j=0;j<=300;j++)
if(vis[i][j])
ans++;
printf("%d\n",ans);
return 0;
}
BFS也可以做
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
bool map[305][305][30][8];
int vis[305][305];
int nx[8]={0,-1,-1,-1,0,1,1,1};
int ny[8]={1,1,0,-1,-1,-1,0,1};
int a[40],n;
struct node
{
int x,y,dir,deep;
}s,now;
void BFS()
{
queue<node>q;
now.x=150; now.y=150; now.deep=1; now.dir=2;
q.push(now);
memset(map,0,sizeof(map));
memset(vis,0,sizeof(vis));
while(!q.empty())
{
s=q.front();
q.pop();
if(map[s.x][s.y][s.deep][s.dir]||s.deep>n)
continue;
map[s.x][s.y][s.deep][s.dir]=1;
for(int i=1;i<=a[s.deep];i++)
{
s.x+=nx[s.dir];
s.y+=ny[s.dir];
vis[s.x][s.y]=1;
}
now.x=s.x; now.y=s.y; now.deep=s.deep+1; now.dir=(s.dir+1)%8;
q.push(now);
now.dir=(s.dir+7)%8;
q.push(now);
}
int ans=0;
for(int i=0;i<=300;i++)
for(int j=0;j<=300;j++)
if(vis[i][j]) ans++;
printf("%d\n",ans);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
BFS();
return 0;
}