pls
This commit is contained in:
		
							parent
							
								
									6e4dac5925
								
							
						
					
					
						commit
						1cd0cc8fc0
					
				
							
								
								
									
										103
									
								
								sk1a/maze.c
									
									
									
									
									
								
							
							
						
						
									
										103
									
								
								sk1a/maze.c
									
									
									
									
									
								
							| @ -21,12 +21,111 @@ int solve_maze(char* maze, int size) { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     printf("\n"); |     printf("\n"); | ||||||
|  |     char maze2d[size][size]; | ||||||
|     for (int y = 0; y < size; y++) { |     for (int y = 0; y < size; y++) { | ||||||
|         for (int x = 0; x < size; x++) { |         for (int x = 0; x < size; x++) { | ||||||
|             printf("%c", maze[size * y + x]); |             printf("%c", maze[size * y + x]); | ||||||
|  |             maze2d[y][x] = maze[size * y + x] == 'x' ? 'x' : 0; | ||||||
|         } |         } | ||||||
|         printf("\n"); |         printf("\n"); | ||||||
|     } |     } | ||||||
|     printf("\nend %d\n\n", size); |     printf("\nstart %d\n\n", size); | ||||||
|     return 0; |      | ||||||
|  |     int posY = 0, posX = 0; | ||||||
|  | 
 | ||||||
|  |     while (1) { | ||||||
|  |         enum direction next_step; | ||||||
|  | 
 | ||||||
|  |         if (posX + 1 < size && maze2d[posY][posX + 1] != 'x' && !(maze2d[posY][posX + 1] & CHECKED_BIT)) { | ||||||
|  |             next_step = EAST; | ||||||
|  |         } else if (posY + 1 < size && maze2d[posY + 1][posX] != 'x' && !(maze2d[posY + 1][posX] & CHECKED_BIT)) { | ||||||
|  |             next_step = SOUTH; | ||||||
|  |         } else if (posX - 1 >= 0 && maze2d[posY][posX - 1] != 'x' && !(maze2d[posY][posX - 1] & CHECKED_BIT)) { | ||||||
|  |             next_step = WEST; | ||||||
|  |         } else if (posY - 1 >= 0 && maze2d[posY - 1][posX] != 'x' && !(maze2d[posY - 1][posX] & CHECKED_BIT)) { | ||||||
|  |             next_step = NORTH; | ||||||
|  |         } else { | ||||||
|  |             next_step = NONE; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (next_step != NONE) { | ||||||
|  |             maze2d[posY][posX] |= CHECKED_BIT; | ||||||
|  |             switch (next_step) { | ||||||
|  |                 case EAST: | ||||||
|  |                     posX += 1; | ||||||
|  |                     maze2d[posY][posX] |= WEST; | ||||||
|  |                     break; | ||||||
|  |                 case SOUTH: | ||||||
|  |                     posY += 1; | ||||||
|  |                     maze2d[posY][posX] |= NORTH; | ||||||
|  |                     break; | ||||||
|  |                 case WEST: | ||||||
|  |                     posX -= 1; | ||||||
|  |                     maze2d[posY][posX] |= EAST; | ||||||
|  |                     break; | ||||||
|  |                 case NORTH: | ||||||
|  |                     posY -= 1; | ||||||
|  |                     maze2d[posY][posX] |= SOUTH; | ||||||
|  |                     break; | ||||||
|  |                 default: | ||||||
|  |                     break; | ||||||
|  |             } | ||||||
|  |         } else { | ||||||
|  |             char came_from = maze2d[posY][posX] & DIRECTION_BITS; | ||||||
|  |             maze2d[posY][posX] = CHECKED_BIT; | ||||||
|  |             switch (came_from) { | ||||||
|  |                 case EAST: | ||||||
|  |                     posX += 1; | ||||||
|  |                     break; | ||||||
|  |                 case SOUTH: | ||||||
|  |                     posY += 1; | ||||||
|  |                     break; | ||||||
|  |                 case WEST: | ||||||
|  |                     posX -= 1; | ||||||
|  |                     break; | ||||||
|  |                 case NORTH: | ||||||
|  |                     posY -= 1; | ||||||
|  |                     break; | ||||||
|  |                 default: | ||||||
|  |                     break; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (posX == 0 && posY == 0) { | ||||||
|  |             printf("\nend"); | ||||||
|  |             return 0; | ||||||
|  |         } else if (posX == size - 1 && posY == size - 1) { | ||||||
|  |             maze2d[0][0] = '*'; | ||||||
|  | 
 | ||||||
|  |             //cleanup data bits
 | ||||||
|  |             for (int y = 0; y < size; y++) { | ||||||
|  |                 for (int x = 0; x < size; x++) { | ||||||
|  |                     if (maze2d[y][x] == CHECKED_BIT || maze2d[y][x] == 0) { | ||||||
|  |                         maze2d[y][x] = ' '; | ||||||
|  |                     } else if (maze2d[y][x] != 'x') { | ||||||
|  |                         maze2d[y][x] = '*'; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             //cleanup redundant routes
 | ||||||
|  |             for (int y = size - 2; y >= 0; y--) { | ||||||
|  |                 for (int x = size - 2; x >= 0; x--) { | ||||||
|  |                     if (maze2d[y][x] == '*' && maze2d[y + 1][x] == '*' && maze2d[y + 1][x + 1] == '*' && maze2d[y][x + 1] == '*') { | ||||||
|  |                         maze2d[y + 1][x + 1] = ' '; | ||||||
|  |                         maze2d[y][x + 1] = ' '; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             //serialize
 | ||||||
|  |             for (int y = 0; y < size; y++) { | ||||||
|  |                 for (int x = 0; x < size; x++) { | ||||||
|  |                     maze[y * size + x] = maze2d[y][x]; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             printf("\nend"); | ||||||
|  |             return 1; | ||||||
|  |         }  | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user