天天看点

怎么理解三维数组?

怎么理解三维数组?
/*#include <iostream>
using namespace std;*/
#include <stdio.h>
#include <string.h>
int a[100][10][10];/*三维数组 存储第i个学校 第j支队伍 的第k个队员*/
int main()
{
    int n, i, j, k;
    scanf("%d", &n);
    int m[110];/*每个学校队伍数量*/ /*注意这里的一个小问题??? 第二行给出 N 个不超过10的正整数, 不要定义为m[10] 他只是说某个m[i]存的数不超过十 注意哈 不然出现段错误 表示数组越界访问 那么它有多少个m[i]呢 不超过一百个 */
    /* 要有一个数 记录最大的队伍数量*/
    int countmax = 0;
    for(i = 0; i < n; i++)
    {
        scanf("%d", &m[i]);
        if(m[i] > countmax)
        {
            countmax = m[i];
        }
    }
    int lasti = -1;
    int bianhao = 0;
    for(j = 0; j < countmax; j++)/*队伍数量 为什么条件是最大的那个?*/
    {
        for(k = 0; k < 10; k++)/*10个队员*/
        {
            for(i = 0; i < n; i++)/*内层循环才为学校编号*/
            {
                if(j < m[i])/* 看题 就拿样例来说 j = 3 m[1] = 4 时
                       
                              表示这第二个学校 还没分配完所有队伍 其他学校的分完了
                                第三个学校 j = 3 m[2] = 2 j > m[i] 第三个学校队伍分配完毕了 所以不会进入下面的语句*/
                {
                    if(lasti == i)/*说明只剩下一个学校*/
                    {               /*lasti是个标记变量 表示上一次操作标记的学校 
                                       如果跟这次操作的学校编号一样 不就表示只剩下这一个学校了吗
                                     i是学校编号*/
                        bianhao += 2;
                    }
                    else
                    {
                        bianhao++;
                    }
                    a[i][j][k] = bianhao;
                    lasti = i;/*每次操作完成后 更新lasti 重新标记此次操作的学校编号*/
                }
            }
        }
    }
    for(i = 0; i < n; i++)
    {
        printf("#%d\n", i + 1);
        for(j = 0; j < m[i]; j++)
        {
            for(k = 0; k < 9; k++)
            {
                printf("%d ", a[i][j][k]);
            }
            printf("%d\n", a[i][j][k]);
        }
    }
    return 0;
}


           
#include<iostream>
#include<queue>
using namespace std;
int M,N,L,T;
int v[1300][130][70];
bool vis[1300][130][70]={false};
int X[6]={1,-1,0,0,0,0};
int Y[6]={0,0,1,-1,0,0};
int Z[6]={0,0,0,0,1,-1};
struct node{
	int x,y,z;
}t; 
bool judge(node t){
	if(t.x>=M||t.x<0||t.y>=N||t.y<0||t.z>=L||t.z<0)	return false;
	if(vis[t.x][t.y][t.z]==true||v[t.x][t.y][t.z]==0)	return false;
	return true;
}
int bfs(int x,int y,int z){
	int total=0;
	queue<node> q;
	t.x=x;t.y=y;t.z=z;
	q.push(t);
	vis[x][y][z]=true;
	while(!q.empty()){
		node top=q.front();
		q.pop();
		total++;
		for(int i=0;i<6;i++){
			t.x=top.x+X[i];
			t.y=top.y+Y[i];
			t.z=top.z+Z[i];
			if(judge(t)==true){
				q.push(t);
				vis[t.x][t.y][t.z]=true;
			}
		} 
	}
	if(total>=T) return total;
	else return 0;
}
int main(){
	int sum=0;
	scanf("%d%d%d%d",&M,&N,&L,&T);
	for(int k=0;k<L;k++){
		for(int i=0;i<M;i++){
			for(int j=0;j<N;j++)
				scanf("%d",&v[i][j][k]);
		}
	}
	for(int k=0;k<L;k++){
		for(int i=0;i<M;i++){
			for(int j=0;j<N;j++){
				if(vis[i][j][k]==false&&v[i][j][k]==1){
					sum+=bfs(i,j,k); 
				}
			}
		} 
	}
	printf("%d",sum); 
	return 0;
}
           

继续阅读