Asgorde Ответов: 3

Как напечатать спиральный узор с символом '#' в C


Учитывая число N. выведите спираль, которая выглядит как вывод ниже.
Ввод
Входные данные состоят из целого числа N (1 ≤ N ≤ 101) , которое представляет собой число N. Это гарантировано
что N mod 4 = 1
Выход
Выходная спираль, которая выглядит как в Примере.
1-й образец ввода
1

Выход для 1-го входного сигнала образца
#


2-й образец ввода
5

Выход для 2-го входного сигнала образца
#####
....#
###.#
#...#
#####

3-й образец ввода
9

Выход для 3-го входного сигнала образца
#########
........#
#######.#
#.....#.#
#.###.#.#
#.#...#.#
#.#####.#
#.......#
#########

4-й образец ввода
11

Выход для 4-го входного сигнала образца
###########
..........#
#########.#
#.......#.#
#.#####.#.#
#.#...#.#.#
#.#.###.#.#
#.#.....#.#
#.#######.#
#.........#
###########


Что я уже пробовал:

Я могу довести его только до 11

#include<stdio.h>

int main(){
	int n;
	scanf("%d",&n);
	fflush(stdin);

	for(int i = 0;i<n;i++){
		for(int j = 0;j<n;j++){
			if(i==0||i==n-1||j==n-1)
				printf("#");
			else if(j==0&&i>1&&i<n-1)
				printf("#");
			else if(i==2&&j<n-2)
				printf("#");
			else if(j==n-3&&i>2&&i<n-2)
				printf("#");
			else if(i==n-3&&j<n-3&&j>1)
				printf("#");
			else if(j==2&&i>3&&i<n-2)
				printf("#");
			else if(i==4&&j>2&&j<n-4)
				printf("#");
			else if(j==6&&i>4&&i<n-4)
				printf("#");
			else if(i==6&&j>3&&j<n-5)
				printf("#");
			else printf(".");
			
		}
		printf("\n");
	}
	getchar();
	return 0;

}

Patrice T

Покажи свой код.

F-ES Sitecore

Начните с верхнего левого # и следуйте за ним вправо, вниз, влево, вверх, вправо и так далее, и обратите внимание на длину каждой строки в символах # и посмотрите, сможете ли вы обнаружить там шаблон.

Rick York

Я думаю, что подход Йохена является хорошим для реализации. Создайте массив NxN, также называемый матрицей, из точек, а затем вы можете пересечь их по спирали и отметить, куда идут хэши.

3 Ответов

Рейтинг:
2

KarstenK

Вам нужна некоторая логика для вашей печати. Функция, которая решает некоторые проблемы.

int input = 0;
//Do a check of input
while( (input % 4) != 1 ) {
  input = AskFromUser();
}
int row = input//looks like the values are the same
int colums = input;//looks like the values are the same

for( int y = 0; y < rows; y++ ) {
  for( int x = 0; x < colums; x++ ) {
    bool result = IsPrintingPoint(x,y, input);
    printf( result ? "." : "#");
  }
  printf("\n");
}
Магия-это функция IsPrintingPoint.
bool IsPrintingPoint( int x, int y, int rows ) {
  //quick check
  if( (y == 0) || (y == rows -1)) return true;

  //TODO: here comes your logic for deciding what to print

  return false;
}


Рейтинг:
1

Patrice T

Прежде всего, вам нужно проанализировать проблему.

999999999
........9
9955555.9
9.....5.9
9.551.5.9
9.5...5.9
9.55555.9
9.......9
999999999

Спираль 9 включает в себя спираль 5, которая включает в себя спираль 1.
Можно предположить, что это будет продолжаться с 13, 17, 21, 25 ...
Вы не можете использовать специальную обработку для каждого размера спирали, вы должны найти другой способ.
В этом случае проще всего использовать 2d-массив, который вы будете использовать как лист бумаги.
Положите карандаш в исходную точку и нарисуйте первую линию, затем вторую и так далее.
Вам нужно только справиться с тем, как вы рисуете вторую петлю в уменьшенном квадрате.
Подумайте, как это будет переводиться в код.


Рейтинг:
0

Jochen Arndt

Я отформатировал выходные данные примера так, чтобы они отображались фиксированным шрифтом.

Взгляните на них, и вы, возможно, найдете алгоритм. Подумайте о том, как бы вы нарисовали его карандашом на графической бумаге (здесь с одним из индексов x/y):

1,1 - 1,N - N,N - 1,N - 1,3 - N-2,3 - N-2,N-2, ....

Одним из подходов может быть создание 2-мерного массива из N x N символов, таких как графическая бумага. Инициализируйте массив точками, чтобы хэш-символы можно было разместить с помощью функции "рисование".

Все, что вам сейчас нужно, - это функция рисования. Если вы расширите мою приведенную выше серию рисунков, то должны найти алгоритм. Обратите внимание, что 3 в моей серии можно также написать так 1 + 2.