消除類遊戲
阿新 • • 發佈:2019-01-25
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define SIZE 40 typedef struct node{ int x, y; } node; typedef struct stack{ node array[SIZE]; int top; } stack; void push(stack* ptr, node elem); node pop(stack* ptr); void flush(stack* ptr); bool isempty(stack* ptr); void print(int** matrix, int n, int m); int main(int argc, const char * argv[]) { int n, m, i, j; int **matrix1, **matrix2; node temp; int prev_color; stack* ptr = (stack*)calloc(1, sizeof(stack)); scanf("%d %d", &n, &m); matrix1 = (int**)calloc(n, sizeof(int*)); matrix2 = (int**)calloc(n, sizeof(int*)); for(i = 0; i < n; i++){ matrix1[i] = (int*)calloc(m, sizeof(int)); matrix2[i] = (int*)calloc(m, sizeof(int)); } for(i = 0; i < n; i++){ for(j = 0; j < m; j++){ scanf("%d", matrix1[i] + j); } } for(i = 0; i < n; i++){ prev_color = matrix1[i][0]; temp.x = i; temp.y = 0; push(ptr, temp); for(j = 1; j < m; j++){ if(matrix1[i][j] == prev_color){ temp.x = i; temp.y = j; push(ptr, temp); } else{ if(ptr->top > 2){ while(!isempty(ptr)){ temp = pop(ptr); matrix2[temp.x][temp.y] = 1; } } else{ flush(ptr); } temp.x = i; temp.y = j; prev_color = matrix1[i][j]; push(ptr, temp); } } if(ptr->top > 2){ while(!isempty(ptr)){ temp = pop(ptr); matrix2[temp.x][temp.y] = 1; } } else{ flush(ptr); } } for(i = 0; i < m; i++){ prev_color = matrix1[0][i]; temp.x = 0; temp.y = i; push(ptr, temp); for(j = 1; j < n; j++){ if(matrix1[j][i] == prev_color){ temp.x = j; temp.y = i; push(ptr, temp); } else{ if(ptr->top > 2){ while(!isempty(ptr)){ temp = pop(ptr); matrix2[temp.x][temp.y] = 1; } } else{ flush(ptr); } temp.x = j; temp.y = i; prev_color = matrix1[j][i]; push(ptr, temp); } } if(ptr->top > 2){ while(!isempty(ptr)){ temp = pop(ptr); matrix2[temp.x][temp.y] = 1; } } else{ flush(ptr); } } for(i = 0; i < n; i++){ for(j = 0; j < m; j++){ if(matrix2[i][j]){ matrix1[i][j] = 0; } } } print(matrix1, n, m); for(i = 0; i < n; i++){ free(matrix1[i]); free(matrix2[i]); } free(matrix1); free(matrix2); return 0; } void push(stack* ptr, node elem){ ptr->array[ptr->top] = elem; (ptr->top)++; } node pop(stack* ptr){ (ptr->top)--; return ptr->array[ptr->top]; } void flush(stack* ptr){ ptr->top = 0; } bool isempty(stack* ptr){ return !(ptr->top); } void print(int** matrix, int n, int m){ int i, j; for(i = 0; i < n; i++){ for(j = 0; j < m - 1; j++){ printf("%d ", matrix[i][j]); } printf("%d\n", matrix[i][j]); } }