大家评下这个8数码写的怎么样,

发布于 2022-10-15 08:21:56 字数 12311 浏览 23 评论 0

本帖最后由 三月廿七 于 2011-04-28 09:42 编辑

闲的蛋疼, Ko,

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #define NUM 5
  5. typedef struct bgMatrix
  6. {
  7.     int v, w;
  8.     char matrix[NUM][NUM];
  9.     int pre;
  10. }Matrix;
  11. typedef struct bgQueue
  12. {
  13.     Matrix* data;
  14.     int maxLength;
  15.     int head;
  16.     int tail;
  17. }BGQueue;
  18. typedef BGQueue* Queue;
  19. typedef struct bgStack
  20. {
  21.     Matrix* data;
  22.     int top;
  23. }BGStack;
  24. typedef BGStack* Stack;
  25. char srcMatrix[NUM][NUM] =
  26. {
  27.     {'*', '*', '*', '*', '*'},
  28.     {'*', '2', '8', '3', '*'},
  29.     {'*', '1', '0', '4', '*'},
  30.     {'*', '7', '6', '5', '*'},
  31.     {'*', '*', '*', '*', '*'}
  32. };
  33. char dstMatrix[NUM][NUM] =
  34. {
  35.     {'*', '*', '*', '*', '*'},
  36.     {'*', '1', '2', '3', '*'},
  37.     {'*', '8', '0', '4', '*'},
  38.     {'*', '7', '6', '5', '*'},
  39.     {'*', '*', '*', '*', '*'}
  40. };
  41. int dx[4] = {0, -1, 0, 1};
  42. int dy[4] = {-1, 0, 1, 0};
  43. int cnt = -1;
  44. Queue queue;
  45. Stack stack;
  46. FILE* log;
  47. void bfs(Matrix matrix);
  48. void initQueue(int length);
  49. void putQueue(Matrix matrix);
  50. Matrix getQueue(void);
  51. int isQueueEmpty(void);
  52. int isQueueFull(void);
  53. void initStack(int length);
  54. void pushStack(Matrix matrix);
  55. Matrix popStack(void);
  56. int isStackEmpty(void);
  57. int matrixCmp(char src[][NUM], char dst[][NUM]);
  58. void matrixCpy(char dst[][NUM], char src[][NUM]);
  59. void matrixPrint(char matrix[][NUM]);
  60. void bgOpenLog(void);
  61. void bgWriteLog(const char* s);
  62. void bgCloseLog(void);
  63. int main(void)
  64. {
  65.     Matrix src;
  66.     bgOpenLog();
  67.     initQueue(3628800);
  68.     initStack(1000);
  69.     src.v = 2;
  70.     src.w = 2;
  71.     matrixCpy(src.matrix, srcMatrix);
  72.     src.pre = cnt;
  73.     bfs(src);
  74.     bgCloseLog();
  75.     getchar();
  76.     return 0;
  77. }
  78. void bfs(Matrix matrix)
  79. {
  80.     Matrix t, s;
  81.     int v, w;
  82.     int direction, tmp;
  83.     putQueue(matrix);
  84.     while (!isQueueEmpty())
  85.     {
  86.         s = getQueue();
  87.         cnt++;
  88.         for (direction = 0; direction < 4; direction++)
  89.         {
  90.             t = s;
  91.             v = t.v + dx[direction]; w = t.w + dy[direction];
  92.             if (srcMatrix[v][w] != '*')
  93.             {
  94.                 tmp = t.matrix[t.v][t.w];
  95.                 t.matrix[t.v][t.w] = t.matrix[v][w];
  96.                 t.matrix[v][w] = tmp;
  97.                 t.v = v;
  98.                 t.w = w;
  99.                 t.pre = cnt;
  100.                 for (tmp = 0; tmp < queue->tail; tmp++)
  101.                 {
  102.                     if (matrixCmp(queue->data[tmp].matrix, t.matrix))
  103.                     {
  104.                         break;
  105.                     }
  106.                 }
  107.                 if (tmp == queue->tail)
  108.                 {
  109.                     putQueue(t);
  110.                     if (matrixCmp(t.matrix, dstMatrix))
  111.                     {
  112.                         pushStack(t);
  113.                         for (tmp = t.pre; !matrixCmp(queue->data[tmp].matrix, srcMatrix); tmp = queue->data[tmp].pre)
  114.                         {
  115.                             pushStack(queue->data[tmp]);
  116.                         }
  117.                         matrixCpy(t.matrix, srcMatrix);
  118.                         pushStack(t);
  119.                         while (!isStackEmpty())
  120.                         {
  121.                             s = popStack();
  122.                             matrixPrint(s.matrix);
  123.                         }
  124.                         printf("Hi, BlueGuy");
  125.                         return;
  126.                     }
  127.                 }
  128.             }
  129.         }
  130.     }
  131. }
  132. void initQueue(int length)
  133. {
  134.     queue = malloc(sizeof(BGQueue));
  135.     queue->data = malloc(sizeof(Matrix) * length);
  136.     queue->maxLength = length;
  137.     queue->head = 0;
  138.     queue->tail = 0;
  139. }
  140. void putQueue(Matrix matrix)
  141. {
  142.     queue->data[queue->tail++] = matrix;
  143.     queue->tail = queue->tail % queue->maxLength;
  144. }
  145. Matrix getQueue(void)
  146. {
  147.     Matrix ret;
  148.     ret = queue->data[queue->head++];
  149.     queue->head = queue->head % queue->maxLength;
  150.     return ret;
  151. }
  152. int isQueueEmpty(void)
  153. {
  154.     return queue->head == queue->tail;
  155. }
  156. int isQueueFull(void)
  157. {
  158.     return ((queue->tail+1) % queue->maxLength) == queue->head;
  159. }
  160. void initStack(int length)
  161. {
  162.     stack = malloc(sizeof(BGStack));
  163.     stack->data = malloc(sizeof(Matrix) * length);
  164.     stack->top = 0;
  165. }
  166. void pushStack(Matrix matrix)
  167. {
  168.     stack->data[stack->top++] = matrix;
  169. }
  170. Matrix popStack(void)
  171. {
  172.     Matrix ret;
  173.     ret = stack->data[--stack->top];
  174.     return ret;
  175. }
  176. int isStackEmpty(void)
  177. {
  178.     return (stack->top == 0);
  179. }
  180. int matrixCmp(char src[][NUM], char dst[][NUM])
  181. {
  182.     int i, j, s, t, ret;
  183.     char srcString[30] = {0};
  184.     char dstString[30] = {0};
  185.     s = 0;
  186.     t = 0;
  187.     for (i = 0; i < NUM; i++)
  188.     {
  189.         for (j = 0; j < NUM; j++)
  190.         {
  191.             srcString[s++] = src[i][j];
  192.             dstString[t++] = dst[i][j];
  193.         }
  194.     }
  195.     ret = !strcmp(srcString, dstString);
  196.     return ret;
  197. }
  198. void matrixCpy(char dst[][NUM], char src[][NUM])
  199. {
  200.     int i, j;
  201.     for (i = 0; i < NUM; i++)
  202.     {
  203.         for (j = 0; j < NUM; j++)
  204.         {
  205.             dst[i][j] = src[i][j];
  206.         }
  207.     }
  208. }
  209. void matrixPrint(char matrix[][NUM])
  210. {
  211.     char logTxt[60] = {0};
  212.     int i, j, k;
  213.     k = 0;
  214.     for (i = 0; i < NUM; i++)
  215.     {
  216.         for (j = 0; j < NUM; j++)
  217.         {
  218.             logTxt[k++] = matrix[i][j];
  219.         }
  220.         logTxt[k++] = '\r';
  221.         logTxt[k++] = '\n';
  222.     }
  223.     logTxt[k++] = '\r';
  224.     logTxt[k++] = '\n';
  225.     bgWriteLog(logTxt);
  226. }
  227. void bgOpenLog(void)
  228. {
  229.     if(log == NULL)
  230.     {
  231.         log = fopen("log.txt", "wb");
  232.     }
  233. }
  234. void bgWriteLog(const char* s)
  235. {
  236.     fwrite(s, sizeof(char), strlen(s), log);
  237. }
  238. void bgCloseLog(void)
  239. {
  240.     fclose(log);
  241.     log = NULL;
  242. }

复制代码

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

一腔孤↑勇 2022-10-22 08:21:56

要用代码方式贴代码。
粗看代码还行

梦里泪两行 2022-10-22 08:21:56

nb啊,lz好nb啊,求带

标点 2022-10-22 08:21:56

本帖最后由 三月廿七 于 2011-04-28 09:49 编辑

nb啊,lz好nb啊,求带
txdgtwpv 发表于 2011-04-28 09:34

帖出来就感觉不对劲,
一时冲动, 算了, 评价吧。

还是得静下心写代码,

冷…雨湿花 2022-10-22 08:21:56

要用代码方式贴代码。
粗看代码还行
hellioncu 发表于 2011-04-28 09:34

    谢谢,

红焚 2022-10-22 08:21:56

什么叫8数码

断爱 2022-10-22 08:21:56

要用代码方式贴代码。
粗看代码还行
hellioncu 发表于 2011-04-28 09:34

    我倒是想帖一个 俄罗斯方块的代码请教一下,
不知为什么 cu禁我的帖, 发不了

狂之美人 2022-10-22 08:21:56

什么叫8数码
cjaizss 发表于 2011-04-28 10:10

    低级程序, 不说也罢。

弥枳 2022-10-22 08:21:56

挺漂亮

只等公子 2022-10-22 08:21:56

以前写过NxN的用A*算法的。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文