Хоть и решил но кажется по-дибильному.
Суть в том что создается матрица в которую сначала записываются '*' по спирали начиная снизу-слева и на каждом повороте вместо '*' записывается '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;
}