大家评下这个8数码写的怎么样,
本帖最后由 三月廿七 于 2011-04-28 09:42 编辑
闲的蛋疼, Ko,
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #define NUM 5
- typedef struct bgMatrix
- {
- int v, w;
- char matrix[NUM][NUM];
- int pre;
- }Matrix;
- typedef struct bgQueue
- {
- Matrix* data;
- int maxLength;
- int head;
- int tail;
- }BGQueue;
- typedef BGQueue* Queue;
- typedef struct bgStack
- {
- Matrix* data;
- int top;
- }BGStack;
- typedef BGStack* Stack;
- char srcMatrix[NUM][NUM] =
- {
- {'*', '*', '*', '*', '*'},
- {'*', '2', '8', '3', '*'},
- {'*', '1', '0', '4', '*'},
- {'*', '7', '6', '5', '*'},
- {'*', '*', '*', '*', '*'}
- };
- char dstMatrix[NUM][NUM] =
- {
- {'*', '*', '*', '*', '*'},
- {'*', '1', '2', '3', '*'},
- {'*', '8', '0', '4', '*'},
- {'*', '7', '6', '5', '*'},
- {'*', '*', '*', '*', '*'}
- };
- int dx[4] = {0, -1, 0, 1};
- int dy[4] = {-1, 0, 1, 0};
- int cnt = -1;
- Queue queue;
- Stack stack;
- FILE* log;
- void bfs(Matrix matrix);
- void initQueue(int length);
- void putQueue(Matrix matrix);
- Matrix getQueue(void);
- int isQueueEmpty(void);
- int isQueueFull(void);
- void initStack(int length);
- void pushStack(Matrix matrix);
- Matrix popStack(void);
- int isStackEmpty(void);
- int matrixCmp(char src[][NUM], char dst[][NUM]);
- void matrixCpy(char dst[][NUM], char src[][NUM]);
- void matrixPrint(char matrix[][NUM]);
- void bgOpenLog(void);
- void bgWriteLog(const char* s);
- void bgCloseLog(void);
- int main(void)
- {
- Matrix src;
- bgOpenLog();
- initQueue(3628800);
- initStack(1000);
- src.v = 2;
- src.w = 2;
- matrixCpy(src.matrix, srcMatrix);
- src.pre = cnt;
- bfs(src);
- bgCloseLog();
- getchar();
- return 0;
- }
- void bfs(Matrix matrix)
- {
- Matrix t, s;
- int v, w;
- int direction, tmp;
- putQueue(matrix);
- while (!isQueueEmpty())
- {
- s = getQueue();
- cnt++;
- for (direction = 0; direction < 4; direction++)
- {
- t = s;
- v = t.v + dx[direction]; w = t.w + dy[direction];
- if (srcMatrix[v][w] != '*')
- {
- tmp = t.matrix[t.v][t.w];
- t.matrix[t.v][t.w] = t.matrix[v][w];
- t.matrix[v][w] = tmp;
- t.v = v;
- t.w = w;
- t.pre = cnt;
- for (tmp = 0; tmp < queue->tail; tmp++)
- {
- if (matrixCmp(queue->data[tmp].matrix, t.matrix))
- {
- break;
- }
- }
- if (tmp == queue->tail)
- {
- putQueue(t);
- if (matrixCmp(t.matrix, dstMatrix))
- {
- pushStack(t);
- for (tmp = t.pre; !matrixCmp(queue->data[tmp].matrix, srcMatrix); tmp = queue->data[tmp].pre)
- {
- pushStack(queue->data[tmp]);
- }
- matrixCpy(t.matrix, srcMatrix);
- pushStack(t);
- while (!isStackEmpty())
- {
- s = popStack();
- matrixPrint(s.matrix);
- }
- printf("Hi, BlueGuy");
- return;
- }
- }
- }
- }
- }
- }
- void initQueue(int length)
- {
- queue = malloc(sizeof(BGQueue));
- queue->data = malloc(sizeof(Matrix) * length);
- queue->maxLength = length;
- queue->head = 0;
- queue->tail = 0;
- }
- void putQueue(Matrix matrix)
- {
- queue->data[queue->tail++] = matrix;
- queue->tail = queue->tail % queue->maxLength;
- }
- Matrix getQueue(void)
- {
- Matrix ret;
- ret = queue->data[queue->head++];
- queue->head = queue->head % queue->maxLength;
- return ret;
- }
- int isQueueEmpty(void)
- {
- return queue->head == queue->tail;
- }
- int isQueueFull(void)
- {
- return ((queue->tail+1) % queue->maxLength) == queue->head;
- }
- void initStack(int length)
- {
- stack = malloc(sizeof(BGStack));
- stack->data = malloc(sizeof(Matrix) * length);
- stack->top = 0;
- }
- void pushStack(Matrix matrix)
- {
- stack->data[stack->top++] = matrix;
- }
- Matrix popStack(void)
- {
- Matrix ret;
- ret = stack->data[--stack->top];
- return ret;
- }
- int isStackEmpty(void)
- {
- return (stack->top == 0);
- }
- int matrixCmp(char src[][NUM], char dst[][NUM])
- {
- int i, j, s, t, ret;
- char srcString[30] = {0};
- char dstString[30] = {0};
- s = 0;
- t = 0;
- for (i = 0; i < NUM; i++)
- {
- for (j = 0; j < NUM; j++)
- {
- srcString[s++] = src[i][j];
- dstString[t++] = dst[i][j];
- }
- }
- ret = !strcmp(srcString, dstString);
- return ret;
- }
- void matrixCpy(char dst[][NUM], char src[][NUM])
- {
- int i, j;
- for (i = 0; i < NUM; i++)
- {
- for (j = 0; j < NUM; j++)
- {
- dst[i][j] = src[i][j];
- }
- }
- }
- void matrixPrint(char matrix[][NUM])
- {
- char logTxt[60] = {0};
- int i, j, k;
- k = 0;
- for (i = 0; i < NUM; i++)
- {
- for (j = 0; j < NUM; j++)
- {
- logTxt[k++] = matrix[i][j];
- }
- logTxt[k++] = '\r';
- logTxt[k++] = '\n';
- }
- logTxt[k++] = '\r';
- logTxt[k++] = '\n';
- bgWriteLog(logTxt);
- }
- void bgOpenLog(void)
- {
- if(log == NULL)
- {
- log = fopen("log.txt", "wb");
- }
- }
- void bgWriteLog(const char* s)
- {
- fwrite(s, sizeof(char), strlen(s), log);
- }
- void bgCloseLog(void)
- {
- fclose(log);
- log = NULL;
- }
复制代码
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
![扫码二维码加入Web技术交流群](/public/img/jiaqun_03.jpg)
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
要用代码方式贴代码。
粗看代码还行
nb啊,lz好nb啊,求带
本帖最后由 三月廿七 于 2011-04-28 09:49 编辑
帖出来就感觉不对劲,
一时冲动, 算了, 评价吧。
还是得静下心写代码,
谢谢,
什么叫8数码
我倒是想帖一个 俄罗斯方块的代码请教一下,
不知为什么 cu禁我的帖, 发不了
低级程序, 不说也罢。
挺漂亮
以前写过NxN的用A*算法的。