Дан куб состоящий из кубиков, каждый кубик случайно выбирается прозрачный\непрозрачный. Найти все просветы в кубе. - 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, завершая работу программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д