彩灯高高挂(bfs)

来源:互联网 发布:查了啊网络电视直播 编辑:程序博客网 时间:2024/03/28 18:27

http://icpc.ahu.edu.cn/OJ/Problem.aspx?id=664



#include <cstdio>#include <cstring>#include <cstdlib>#include <string>#include <map>#include <cmath>#include <queue>#include <stack>#include <iostream>#include <stdexcept>#include <cstddef>#include <algorithm>#include <vector>#include <numeric>#include <cctype>#define LL long long#define Endl endl#define INF 0x7fffffff//#define WJ#define LIM x<0||y<0||z<0||x>=n||y>=n||z>=n#define LIM2 (BFS[x][y][z]!=0&&BFS[x][y][z]<cnt)using namespace std;const int maxn=42;int vis[maxn][maxn][maxn],shu[64010],BFS[maxn][maxn][maxn];int dir[6][3]={1,0,0,-1,0,0,0,-1,0,0,1,0,0,0,1,0,0,-1};struct point{int x,y,z;};queue<point> q[2];int main(int argc, char *argv[]){#ifdef WJ//freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);#endifint t,n,m;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);memset(vis,0,sizeof(vis));memset(BFS,0,sizeof(BFS));memset(shu,0,sizeof(shu));int a=0,b=1;point st;int cnt=1;for(int i=1;i<=m;i++){scanf("%d%d%d",&st.x,&st.y,&st.z);q[b].push(st);vis[st.x][st.y][st.z]=i;BFS[st.x][st.y][st.z]=cnt;}point kk,xin;int x,y,z;while(!q[b].empty()){swap(a,b);cnt++;while(!q[a].empty()){kk=q[a].front();BFS[kk.x][kk.y][kk.z]=1;q[a].pop();for(int i=0;i<6;i++){x=kk.x+dir[i][0];y=kk.y+dir[i][1];z=kk.z+dir[i][2];if(LIM||LIM2) continue;xin.x=x; xin.y=y; xin.z=z;if(vis[x][y][z]==0){q[b].push(xin);BFS[x][y][z]=cnt;vis[x][y][z]=vis[kk.x][kk.y][kk.z];}elsevis[x][y][z]=min(vis[x][y][z],vis[kk.x][kk.y][kk.z]);}}}for(int i=0;i<n;i++){for(int j=0;j<n;j++){for(int k=0;k<n;k++)shu[vis[i][j][k]]++;}}printf("%d",shu[1]);for(int i=2;i<=m;i++) printf(" %d",shu[i]);printf("\n");}return 0;}


0 0