| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2994 人关注过本帖
标题:广度优先搜索解 <八数码>, 求意见, 求bug/
只看楼主 加入收藏
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
难道代码有错? 我自己都忍受不了了

我就是真命天子,顺我者生,逆我者死!
2011-01-24 19:07
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
代码是完全正确的了,

参照了下图,对比数组前28项值,是一样的
图片附件: 游客没有浏览图片的权限,请 登录注册


这图说明偶的代码还能优化, 判断的不够及时


[ 本帖最后由 BlueGuy 于 2011-1-24 21:17 编辑 ]

我就是真命天子,顺我者生,逆我者死!
2011-01-24 20:54
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
#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;
}

我就是真命天子,顺我者生,逆我者死!
2011-01-25 21:29
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
一个节点都不多余~~~

我就是真命天子,顺我者生,逆我者死!
2011-01-25 21:29
a343637412
Rank: 7Rank: 7Rank: 7
来 自:そ ら
等 级:黑侠
帖 子:357
专家分:620
注 册:2010-9-26
收藏
得分:17 






                            很久没来了   
                                                来冒个泡0.0
2011-01-26 03:07
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
回复 24楼 BlueGuy
建议你不要用for逐一判断,最好用系统函数

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-26 11:17
huangapple
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:545
专家分:1790
注 册:2010-12-30
收藏
得分:0 
以下是引用BlueGuy在2011-1-23 17:09:03的发言:

我怎么感觉你是在讽刺我,
从你楼下的那个SB的回帖,越发的证明了我的感觉是对的。
看到这里我就特鄙视楼主,叫人提意见,还说别人sb?

而且你这个在tc里可以运行,但在vc里就不行了。malloc都没转换


勤能补拙,熟能生巧!
2011-01-28 19:04
Alar30
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:10
帖 子:988
专家分:1627
注 册:2009-9-8
收藏
得分:0 
话说
建议大家还是把讨论重点放在代码上。。。
2011-01-29 14:12
zyx609239305
Rank: 2
来 自:大连
等 级:论坛游民
帖 子:30
专家分:32
注 册:2010-10-1
收藏
得分:0 
以下是引用zyx609239305在2011-1-24 13:33:15的发言:

我怎么运行了,啥都不出来呢。。。

。。。。。耐心有啊,我盯着看了4分钟呢
2011-01-29 19:28
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
以下是引用huangapple在2011-1-28 19:04:01的发言:

看到这里我就特鄙视楼主,叫人提意见,还说别人sb?

而且你这个在tc里可以运行,但在vc里就不行了。malloc都没转换
告诉你一个小技巧, malloc 不需要转换的

经过我简单分析,发现八数码 和那个 迷宫寻路 是一模一样的问题,
我很少做题目,正好拿 八数码 小试牛刀一下,验证形式化的理论能不能
很好的解决实际问题。
通过这份代码,使我更深刻的理解了 bfs 的改进版本。

我在写这份代码之前就已经确信自己能够把代码写的完全正确,
而且我也不是抱着讨论或者学习的态度发帖的,所以别人提不提意见关系不是很大。
这份代码在形式上已经足够简单,本着低调的分享精神才帖出来求意见,求bug.

[ 本帖最后由 BlueGuy 于 2011-1-29 21:12 编辑 ]

我就是真命天子,顺我者生,逆我者死!
2011-01-29 20:16
快速回复:广度优先搜索解 <八数码>, 求意见, 求bug/
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023443 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved