1. 程式人生 > 其它 >L3-004 腫瘤診斷(天梯賽)

L3-004 腫瘤診斷(天梯賽)

天梯賽就是喜歡搞些複雜的dfs和bfs

這題就是一道三維的bfs

#include<iostream>
#include<queue>
using namespace std;
struct Node
{
    int a,b,c;
    Node(int a1,int b1,int c1):a(a1),b(b1),c(c1){};
};
const int maxa=1286+5,maxb=128+5,maxc=60+5;
int G[maxa][maxb][maxc];
int vis[maxa][maxb][maxc];
int M,N,L,T;
int pa[6]={1,-1,0,0,0,0},pb[6]={0,0,1,-1,0,0},pc[6]={0,0,0,0,1,-1};
bool isedgeok(int a,int b,int c)
{
    if(a<M&&a>=0&&b<N&&b>=0&&c<L&&c>=0) return true;
    return false;
}
int bfs(int a,int b,int c)
{
    if(!G[a][b][c]||vis[a][b][c]) return 0;
    int cnt=1;
    vis[a][b][c]=1;
    queue<Node> qu;
    qu.push(Node(a,b,c));//bug 1
    while(!qu.empty())
    {
        auto tmp=qu.front();
        qu.pop();
        a=tmp.a,b=tmp.b,c=tmp.c;
        for(int i=0;i<6;++i)
        {
            int tmpa=a+pa[i],tmpb=b+pb[i],tmpc=c+pc[i];
            if(isedgeok(tmpa,tmpb,tmpc)&&!vis[tmpa][tmpb][tmpc]&&G[tmpa][tmpb][tmpc])//bug 0
            {
                cnt++;
                qu.push(Node(tmpa,tmpb,tmpc));
                vis[tmpa][tmpb][tmpc]=1;
            }
        }
    }
    if(cnt>=T) return cnt;
    return 0;
}
int main()
{
    cin>>M>>N>>L>>T;
    for(int i=0;i<L;++i)
        for(int j=0;j<M;++j)
            for(int k=0;k<N;++k)
                cin>>G[j][k][i];
    int sum=0;
    for(int i=0;i<L;++i)
        for(int j=0;j<M;++j)
            for(int k=0;k<N;++k)
                    sum+=bfs(j,k,i);
    cout<<sum;
}