天天看點

怎麼了解三維數組?

怎麼了解三維數組?
/*#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;
}
           

繼續閱讀