Задать вопрос
Sergomen
@Sergomen
Просто делай добро и оно вернётся

Как правильно сделать условие для прохождения символом по спирали в матрице?

По заданию нужно по примерно такой схеме 63c08c082b2a3948851518.png
сделать "прохождение" символом по спирали.

Освновной код написал и он может выводить символ в нужные стороны но я не понимаю какие условия сделать чтобы символ выводился по такому пути как надо.

Сейчас выводится вот так:
63c08c9f1b2f0854391045.png

Мой код
#include <stdio.h>
#include <windows.h>
#include <unistd.h>

void gotoxy(int x, int y){
    COORD c;
    c.X = x;
    c.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
}

int main() {
    system("cls");
    const int ROWS = 80;
    const int COLS = 24;
    char matrix[ROWS][COLS];
    char symbol = '*';
    int row = ROWS/2;
    int col = COLS/2;
    int row_dir = 1; // 1 - вправо, -1 - влево, 0 - никуда
    int col_dir = 0; // 1 - вниз,   -1 - вверх, 0 - никуда
    int visited = 0;
    
    // заполнение матрицы пробелами 
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            matrix[i][j] = ' ';
        }
    }
    while (visited < ROWS * COLS) {
        matrix[row][col] = symbol;
        gotoxy(row,col);
        printf("%c", symbol);
        usleep(1000);
        visited++;

        int next_row = row + row_dir;
        int next_col = col + col_dir;

        // если следующие координаты отрицательные или выходят за границы или не равны пробелу
        if (next_row < 0 || next_row >= ROWS || next_col < 0 || next_col >= COLS || matrix[next_row][next_col] != ' ' ) {
            // если впаво то вверх
            if (row_dir == 1 && col_dir == 0) {
                row_dir = 0; col_dir = -1;
            }
            // если вверх то влево
            else if (row_dir == 0 && col_dir == -1) {
                row_dir = -1; col_dir = 0;
            }
            // если влево то вниз
            else if (row_dir == -1 && col_dir == 0){
                row_dir = 0; col_dir = 1;
            }
            // иначе вправо
            else{
                row_dir = 1; col_dir = 0;
            }
        }
        row += row_dir;
        col += col_dir;
    }
    return 0;
}

Как сделать чтобы символ "проходил"/выводился как нужно?
  • Вопрос задан
  • 94 просмотра
Подписаться 1 Простой 4 комментария
Решения вопроса 1
Sergomen
@Sergomen Автор вопроса
Просто делай добро и оно вернётся
Хоть и решил но кажется по-дибильному.

Суть в том что создается матрица в которую сначала записываются '*' по спирали начиная снизу-слева и на каждом повороте вместо '*' записывается '1' и в конце заполнения запоминается координаты последней '*'.

Потом происходит почти то же самое но с отличием в том что теперь '*' выводится по координатам на экране начиная с этих последних координат; когда ячейка матрицы == '1' делается поворот

#include <stdio.h>
#include <windows.h>
#include <unistd.h>

void gotoxy(int x, int y){
    COORD c;
    c.X = x;
    c.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
}

void dir_next_1(int &row_dir, int &col_dir){
	// если впаво то вверх
	if (row_dir == 1 && col_dir == 0) {
	    row_dir = 0; col_dir = -1;
	}
	// если вверх то влево
	else if (row_dir == 0 && col_dir == -1) {
	    row_dir = -1; col_dir = 0;
	}
	// если влево то вниз
	else if (row_dir == -1 && col_dir == 0){
	    row_dir = 0; col_dir = 1;
	}
	// иначе вправо
	else{
	    row_dir = 1; col_dir = 0;
	}
}

void dir_next_2(int &row_dir, int &col_dir){
	// если вверх то вправо
	if (row_dir == 0 && col_dir == -1) {
		row_dir = 1; col_dir = 0;  
	}
	// если вправо то вниз
	else if  (row_dir == 1 && col_dir == 0)  {
		row_dir = 0; col_dir = 1;
	}
	// если вниз то влево
	else if (row_dir == 0 && col_dir == 1){
	    row_dir = -1; col_dir = 0;
	}
	// иначе вверх
	else{
	    row_dir = 0; col_dir = -1;
	}
}

void worker(bool next,char matrix[][24], int ROWS, int COLS, int &visited, int row, int col, int &row_dir, int &col_dir, int &end_row, int &end_col){
	while (visited < ROWS * COLS) {
	    visited++;
	    int next_row = row + row_dir;
	    int next_col = col + col_dir;
	    if(next){
	    	gotoxy(row,col);
	    	printf("*");
	    	usleep(1000);
	    	if (matrix[row][col] == '1')
	    		dir_next_1(row_dir, col_dir);
	    	matrix[row][col] = '*';
	    }
	    else{
	    	matrix[row][col] = '*';
	    	if (next_row < 0 || next_row >= ROWS || next_col < 0 || next_col >= COLS || matrix[next_row][next_col] != ' ' ) {
	    		matrix[row][col] = '1';
	    		dir_next_2(row_dir, col_dir);
	    	}
	    }
	    row += row_dir;
	    col += col_dir;
	    if (!(visited < ROWS * COLS)){
	    	matrix[row][col+1]  = '*';
	    	end_row = row;
	    	end_col = col+1;
	    }
	}
}


int main() {
    system("cls");
    const int ROWS = 80;
    const int COLS = 24;
    char matrix[ROWS][COLS];

    int row = 0;
    int col = COLS - 1;
    int row_dir = 0; // 1 - вправо, -1 - влево, 0 - никуда
    int col_dir = -1; // 1 - вниз,   -1 - вверх, 0 - никуда
    int visited = 0;
    
    // заполнение матрицы пробелами 
    for (int i = 0; i < ROWS; i++)
        for (int j = 0; j < COLS; j++)
            matrix[i][j] = ' ';

    int end_row = 0;
    int end_col = 0;

    worker(false, matrix, ROWS, COLS, visited, row, col, row_dir, col_dir, end_row, end_col);
    
    row = end_row;
    col = end_col;
    visited = 0;
    row_dir = 1; // вправо
    col_dir = 0; // никуда
    worker(true, matrix, ROWS, COLS, visited, row, col, row_dir, col_dir, end_row, end_col);
    return 0;
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы