#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int N=110;
int l,r,c;
char map[N][N][N];
int vis[N][N][N];
int vx[]={1,-1,0,0,0,0};
int vy[]={0,0,1,-1,0,0};
int vk[]={0,0,0,0,1,-1};
typedef struct Node
{
int k,x,y;
};
bool check(int K,int X,int Y)
{
if(X<0||X>=r||Y<0||Y>=c||K<0||K>=l)
return false;
if(map[K][X][Y]=='#')
return false;
if(vis[K][X][Y]!=0)
return false;
return true;
}
int bfs(Node start)
{
queue<Node> q;
memset(vis,0,sizeof(vis));
q.push(start);
while(!q.empty())
{
Node tem=q.front();
if(map[tem.k][tem.x][tem.y]=='E')
return vis[tem.k][tem.x][tem.y];
q.pop();
for(int i=0;i<6;i++)
{
int X=tem.x+vx[i];
int Y=tem.y+vy[i];
int K=tem.k+vk[i];
if(check(K,X,Y)==false)
continue;
vis[K][X][Y]=vis[tem.k][tem.x][tem.y]+1;
Node t={K,X,Y};
q.push(t);
}
}
return 0;
}
int main()
{
int i,j,bx,by,bk,k;
Node start;
string ss;
while(1)
{
cin>>l>>r>>c;
if(l==0&&r==0&&c==0)
break;
for(k=0;k<l;k++)
{
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
cin>>map[k][i][j];
if(map[k][i][j]=='S')
{
bk=k,bx=i,by=j;
start={bk,bx,by};
}
}
}
getline(cin,ss);
}
int ans=bfs(start);
if(ans)
cout<<"Escaped in "<<ans<<" minute(s)."<<endl;
else
cout<<"Trapped!"<<endl;
}
return 0;
}
#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
using namespace std;
const int N=1010;
char map[N][N];
bool ts[N][N];
int vx[]={1,-1,0,0};
int vy[]={0,0,1,-1};
int ans,n;
typedef struct Node
{
int x,y;
};
bool check(int X,int Y)
{
if(X<0||X>=n||Y<0||Y>=n)
return false;
if(map[X][Y]=='.')
return false;
if(ts[X][Y]==true)
return false;
return true;
}
void bfs(int i,int j)
{
Node start={i,j};
queue<Node> q;
ts[i][j]=true;
q.push(start);
int total=1,ver=0;
while(q.size())
{
Node t=q.front();
q.pop();
int flag=false;
for(i=0;i<4;i++)
{
int X=t.x+vx[i];
int Y=t.y+vy[i];
if(X>=0&&X<n&&Y>=0&&Y<n&&map[X][Y]=='.')
{
flag=true;
}
if(check(X,Y)==false)
continue;
total++;
ts[X][Y]=true;
Node f={X,Y};
q.push(f);
}
if(flag)
ver++;
}
if(total==ver)
ans++;
}
int main()
{
int i,j;
cin>>n;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cin>>map[i][j];
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(!ts[i][j]&&map[i][j]=='#')
{
bfs(i,j);
}
}
}
cout<<ans;
return 0;
}
3.徹底二叉樹的權值
給定一棵包含 N 個節點的徹底二叉樹,樹上每一個節點都有一個權值,按從上到下、從左到右的順序依次是 A1,A2,⋅⋅⋅AN,以下圖所示:

如今小明要把相同深度的節點的權值加在一塊兒,他想知道哪一個深度的節點權值之和最大?
若是有多個深度的權值和同爲最大,請你輸出其中最小的深度。
注:根的深度是 1。
輸入格式
第一行包含一個整數 N。
第二行包含 N 個整數 A1,A2,⋅⋅⋅AN。
輸出格式
輸出一個整數表明答案。
數據範圍
1≤N≤105,
−105≤Ai≤105
輸入樣例:
7
1 6 5 4 3 2 1
輸出樣例:
2
#include<iostream>
using namespace std;
const int N=100010;
typedef long long ll;
ll a[N];
ll maxn,sum,ans;
int main()
{
ll i,j,n,k;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
maxn=a[1];
ans=1;
k=1;
for(i=2;i<=n;i=i*2)
{
sum=0;
for(j=i;j<=i*2-1&&j<=n;j++)
{
sum+=a[j];
}
k++;
if(sum>maxn)
{
maxn=sum;
ans=k;
}
}
cout<<ans;
return 0;
}