diff --git a/A*算法.c b/A*算法.c new file mode 100644 index 0000000..7505e22 --- /dev/null +++ b/A*算法.c @@ -0,0 +1,196 @@ +#include +#include +#include +#include + +#define N 3 // ¶¨ÒåƴͼµÄά¶È£¬ÕâÊÇÒ»¸ö3x3µÄƴͼ + +typedef struct Node { + int puzzle[N][N]; // ´æ´¢Æ´Í¼×´Ì¬µÄÊý×é + struct Node* parent; // Ö¸Ïò¸¸½ÚµãµÄÖ¸Õ룬ÓÃÓÚ×·×Ù·¾¶ + int f, g, h; // A*Ëã·¨ÖÐµÄ f, g, h Öµ +} Node; + +// ´´½¨ÐµÄƴͼ½Úµã +Node* createNode(int puzzle[N][N]) { + Node* newnode = (Node*)malloc(sizeof(Node)); + //ÇëʵÏָú¯Êý + + + +} + +// ¼ì²éÁ½¸öƴͼ״̬ÊÇ·ñÏàͬ +bool isSamePuzzle(int a[N][N], int b[N][N]) { + //ÏàͬÔò·µ»Øtrue,·ñÔò·µ»Øfalse + + + +} + +// ´òӡƴͼ״̬ +void printPuzzle(int puzzle[N][N]) { + //Ë«ÖØforÑ­»·ÊµÏÖƴͼµÄ´òÓ¡ + + + + printf("\n"); +} + + +// Æô·¢º¯Êý£¬¼ÆË㵱ǰ״̬µ½Ä¿±ê״̬µÄ¹À¼Æ´ú¼Û +int heuristic(Node* current, Node* goal) { + int h = 0; + // ¼ÆË㲻ƥÅäµÄƴͼ¿éÊýÁ¿ + + +} + +// Òƶ¯²Ù×÷£¬Éú³ÉеÄƴͼ״̬ +Node* move(Node* current, int dir) { + int key_x, key_y;//¼Ç¼¿Õ°×¿éµÄλÖà + // ÕÒµ½¿Õ°×¿éµÄλÖà + + //¸ønew_x¡¢new_y¸³Öµ + + // ¸ù¾ÝÒƶ¯·½Ïò¸üÐÂпéµÄλÖã¬ÉÏÏÂ×óÓÒÒƶ¯ + + // ¼ì²éÐÂλÖÃÊÇ·ñÔڱ߽çÄÚ + + + // ´´½¨Ð½ڵ㣬¸´ÖƵ±Ç°Æ´Í¼×´Ì¬£¬²¢½»»»¿éµÄλÖà + Node* new_node = createNode(current->puzzle); + new_node->puzzle[key_x][key_y] = current->puzzle[new_x][new_y]; + new_node->puzzle[new_x][new_y] = 0; + return new_node; +} + +// A*Ëã·¨£¬Ñ°ÕÒ×î¶Ì·¾¶ +Node* AStar(Node* start, Node* goal) { + Node* OPEN[1000]; // ¿ª·ÅÁÐ±í£¬ÓÃÓÚ´æ´¢´ý̽Ë÷µÄ½Úµã + Node* CLOSED[1000]; // ¹Ø±ÕÁÐ±í£¬ÓÃÓÚ´æ´¢ÒÑ̽Ë÷µÄ½Úµã + int OPEN_SIZE = 0; // ¿ª·ÅÁбíµÄ´óС + int CLOSED_SIZE = 0; // ¹Ø±ÕÁбíµÄ´óС + + OPEN[0] = start; // ½«Æðʼ½ÚµãÌí¼Óµ½¿ª·ÅÁбí + OPEN_SIZE = 1; // ¿ª·ÅÁбíµÄ´óСÉèÖÃΪ1 + CLOSED_SIZE = 0; // ¹Ø±ÕÁбíµÄ´óСÉèÖÃΪ0 + + while (OPEN_SIZE > 0) {//¶ÔopenÁбí½øÐвÙ×÷ + int min_f = OPEN[0]->f;//³õʼ»¯×îСµÄf + int min_index = 0; + // ²éÕÒ¿ª·ÅÁбíÖоßÓÐ×îСfÖµµÄ½Úµã + + + Node* current = OPEN[min_index]; // »ñÈ¡¾ßÓÐ×îСfÖµµÄ½Úµã + + // Èç¹ûµ±Ç°½ÚµãÓëÄ¿±ê״̬ƥÅ䣬±íʾÕÒµ½½â + + + //¿ª·ÅÁбíµÄ´óС¼õ1£¬±íʾ´Ó¿ª·ÅÁбíÖÐÒƳýÁËÒ»¸ö½Úµã + + + //½«×îС f ÖµµÄ½ÚµãÒƵ½¿ª·ÅÁбíµÄĩ⣬ÒÔ±ãÉÔºó½«ÆäÌí¼Óµ½¹Ø±ÕÁбíÖС£ + //ÕâÊÇΪÁËÓÅ»¯¿ª·ÅÁбíµÄ½á¹¹¡£ + Node* temp = OPEN[min_index]; + OPEN[min_index] = OPEN[OPEN_SIZE]; + OPEN[OPEN_SIZE] = temp; + + //½«µ±Ç°½ÚµãÌí¼Óµ½¹Ø±ÕÁÐ±í£¬¹Ø±ÕÁбí´óС¼Ó1 + + + int key = 0; + // ²éÕÒµ±Ç°½ÚµãÖпհ׿éµÄλÖà + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + if (current->puzzle[i][j] == 0) { + key = i * N + j; + break; + } + } + } + + // ³¢ÊÔËĸö·½ÏòµÄÒƶ¯²Ù×÷ + for (int dir = 0; dir < 4; dir++) { + Node* new_node = move(current, dir); + + if (new_node != NULL && !isSamePuzzle(new_node->puzzle, current->puzzle)) { + //µÃµ½¶ÔÓ¦µÄg¡¢f¡¢hÖµ + int gNew = current->g + 1; + int hNew = heuristic(new_node, goal); + int fNew = gNew + hNew; + + bool in_OPEN = false; + int open_index = -1; + // ¼ì²éнڵãÊÇ·ñÔÚ¿ª·ÅÁбíÖÐ + for (int i = 0; i < OPEN_SIZE; i++) { + if (isSamePuzzle(new_node->puzzle, OPEN[i]->puzzle)) { + in_OPEN = true; + open_index = i; + break; + } + } + + bool in_CLOSED = false; + + // ¼ì²éнڵãÊÇ·ñÔڹرÕÁбíÖÐ + + //Èô¸Ã½Úµã»ú²»ÔÚ¿ª·ÅÁбíÖÐÒ²²»ÔڹرÕÁбíÖÐ + if (!in_OPEN && !in_CLOSED) { + //°ÑgNew¡¢hNew¡¢fNew¸³¸ønew_nod¶ÔÓ¦µÄg¡¢h¡¢fÖµ£¬²¢½«Æ丸½ÚµãÉèÖÃΪµ±Ç°½Úµã¡£ + + // Ìí¼Óнڵãnew_nodeµ½¿ª·ÅÁÐ±í£¬¿ª·ÅÁбí´óС¼Ó1 + + } + //Èç¹ûнڵãÒѾ­ÔÚ¿ª·ÅÁбíÖУ¬µ«Ð嵀 f Öµ¸üС£¬½«¸üпª·ÅÁбíÖÐÒÑ´æÔÚ½ÚµãµÄÐÅÏ¢¡£ + else if (in_OPEN && fNew < OPEN[open_index]->f) { + + } + } + } + } + + return NULL; // ÎÞ½â +} + +// ´òÓ¡½â·¾¶ +void printPath(Node* final) { + if (final == NULL) { + return; + } + printPath(final->parent); // µÝ¹é´òӡ·¾¶ + for (int i = 0; i < N; i++) { + if (i%3==0){ + printf("-------\n"); + } + for (int j = 0; j < N; j++) { + printf("%d ", final->puzzle[i][j]); + } + + printf("\n"); + + } +} + +int main() { + //int start[N][N] = {{2, 0, 3}, {1, 8, 4}, {7, 6, 5}}; + //int target[N][N] = {{1, 2, 3}, {8, 0, 4}, {7, 6, 5}}; + + // int start[N][N] = {{2, 8, 3}, {1, 6, 4}, {7, 0, 5}}; + // int target[N][N] = {{1, 2, 3}, {8, 0, 4}, {7, 6, 5}}; + + int start[N][N] = {{2, 8, 3}, {1, 0, 4}, {7, 6, 5}}; + int target[N][N] = {{1, 2, 3}, {8, 0, 4}, {7, 6, 5}}; + Node* init = createNode(start); + Node* goal = createNode(target); + + Node* final = AStar(init, goal); + if (final) { + printf("This problem has a solution:\n"); + printPath(final); // ´òÓ¡½â·¾¶ + } else { + printf("This problem has no solution£¡\n"); + } + + return 0; +}