Дан куб состоящий из кубиков, каждый кубик случайно выбирается прозрачный\непрозрачный. Найти все просветы в кубе. - C (СИ)
Формулировка задачи:
Просветы. Куб состоит из n^3(для начала примем что куб у нас 3х3х3) прозрачных и непрозрачных
элементарных кубиков. Имеется ли хотя бы один просвет по
каждому из трех измерений? Если это так, вывести координаты
каждого просвета.
Рекомендация. Для хранения куба выделить трехмерный массив с
базовым типом минимально возможного размера.
Вот код, подскажите, адекват ли я, и натолкните на мысль как организовать правильно поиск + вывод координат.
// 3.2.27.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
void main()
{
int n,i,j,k,null;
printf("Vvedite razmernost kuba: ");
scanf("%d",&n);
int*** arr=new int**[n]; //создание
for (int i = 0; i < n; i++)
{
arr[i] = new int *[n];
for (int j = 0; j <n; j++)
arr[i][j] = new int [n];
} //массива
for (i=0; i<n; i++)
for (j=0; j<n; j++)
for (k=0; k<n; k++) arr[i][j][k]=rand()%2;
for (i=0; i<n; i++)
{
printf("\n");
for (j=0; j<n; j++)
{
printf(" ");
for (k=0; k<n; k++)
printf(" %d",arr[i][j][k]);
}
}
printf("\n");
for (i=0; i<n; i++) //проход по каждому из направлей типо вверх, вниз, всторону
for (j=0; j<n; j++)
if (arr[i][j][0]==0)
{
for (k=0; k<n;k++)
{ if (arr[i][j][k]==0)
printf(" 1 %d,%d,%d \n",i,j,k);
}
}
for (i=0; i<n; i++)
for (k=0; k<n; k++)
if (arr[i][0][k]==0)
{
for (j=0; j<n;j++)
{ if (arr[i][j][k]==0)
printf(" 1 %d,%d,%d \n",i,j,k);
}
}
for (j=0; j<n; j++)
for (k=0; k<n; k++)
if (arr[0][j][k]==0)
{
for ( i=0; i<n;i++)
{ if (arr[i][j][k]==0)
printf(" 3 %d,%d,%d \n",i,j,k);
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j <n; j++)
free(arr[i][j]);
free(arr[i]);
}
free (arr);
getch();
}Решение задачи: «Дан куб состоящий из кубиков, каждый кубик случайно выбирается прозрачный\непрозрачный. Найти все просветы в кубе.»
textual
Листинг программы
#include <stdio.h>
const int N=4;//пусть размер равен 4
unsigned char a[N][N][N];//кубик
int main(){
unsigned char spaces[N][N][3];
int i, j, k;
for (i=0; i<N; i++)
for (j=0; j<N; j++)
spaces[i][j][0]=spaces[i][j][1]=spaces[i][j][2]=0;
for (i=0; i<N; i++)
for (j=0; j<N; j++)
for (k=0; k<N; k++)
{
scanf("%d", &(a[i][j][k]));
spaces[i][j][0]=spaces[i][j][0]||a[i][j][k];
spaces[i][k][1]=spaces[i][k][1]||a[i][j][k];
spaces[j][k][2]=spaces[j][k][2]||a[i][j][k];
}
for (k=0; k<3; k++){
printf("\nПросветы в %d-й грани", k);
for (i=0; i<N; i++)
for (j=0; j<N; j++)
if (!spaces[i][j][k]) printf("(%d:%d), ", i, j);
}
return 0;
}
Объяснение кода листинга программы
- Включаем заголовочный файл stdio.h для использования функций ввода-вывода
- Задаём размер куба N=4
- Создаём массив куба a[N][N][N] и инициализируем его значениями по умолчанию(прозрачный)
- Создаём массив spaces[N][N][3] для хранения информации о просветах в каждой грани куба
- Проходим по всем элементам массива spaces и устанавливаем начальные значения(0) для всех граней
- Проходим по всем элементам куба a в цикле и с помощью функции scanf считываем значения элементов
- Обновляем значения массива spaces, устанавливая в true(1) для соответствующих элементов, если значение элемента куба a равно 0(непрозрачный)
- Выводим на экран информацию о просветах в каждой грани куба
- Возвращаем 0, завершая работу программы