| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2994 人关注过本帖
标题:广度优先搜索解 <八数码>, 求意见, 求bug/
只看楼主 加入收藏
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
结帖率:94.72%
收藏
已结贴  问题点数:100 回复次数:31 
广度优先搜索解 <八数码>, 求意见, 求bug/
我得去买票了,....

#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;


char srcMatrix[NUM][NUM] =
{
    {'*', '*', '*', '*', '*'},
    {'*', '1', '2', '3', '*'},
    {'*', '4', '5', '6', '*'},
    {'*', '7', '8', '0', '*'},
    {'*', '*', '*', '*', '*'}
};

char dstMatrix[NUM][NUM] =
{
    {'*', '*', '*', '*', '*'},
    {'*', '1', '2', '0', '*'},
    {'*', '4', '5', '3', '*'},
    {'*', '7', '8', '6', '*'},
    {'*', '*', '*', '*', '*'}
};

int dx[4] = {0, 0, -1, 1};

int dy[4] = {-1, 1, 0, 0};

int cnt = -1;

Queue queue;

FILE* log;

void bfs(Matrix matrix);

void initQueue(int length);

void putQueue(Matrix matrix);

Matrix getQueue(void);

int isQueueEmpty(void);

int isQueueFull(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(5200);
   
    src.v = 3;
    src.w = 3;
    matrixCpy(src.matrix, srcMatrix);
    src.pre = cnt;

    bfs(src);

    bgCloseLog();

    getchar();

    return 0;
}

void bfs(Matrix matrix)
{
    Matrix t;
   
    int v, w;
    int direction, tmp;

    putQueue(matrix);

    while (!isQueueEmpty())
    {
        t = getQueue();

        if (!matrixCmp(t.matrix, dstMatrix))
        {
            cnt++;

            for (direction = 0; direction < 4; direction++)
            {
                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;

                    putQueue(t);
                }
            }
        }
        else
        {
            matrixPrint(t.matrix);

            for (tmp = t.pre; !matrixCmp(queue->data[tmp].matrix, srcMatrix); tmp = queue->data[tmp].pre)
            {
                matrixPrint(queue->data[tmp].matrix);
            }
            
            matrixPrint(srcMatrix);
            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;
}

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;
}
搜索更多相关主题的帖子: 数码 搜索 include Matrix matrix 
2011-01-23 11:27
马后炮
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:156
专家分:560
注 册:2010-12-17
收藏
得分:17 
不敢,不敢,我的水平还没到那个档次

樱之雪,晓之车
2011-01-23 12:31
zhi890130
Rank: 2
等 级:论坛游民
帖 子:6
专家分:17
注 册:2011-1-21
收藏
得分:17 
感谢楼主,新人认真学习了,不过有些不怎么懂。
2011-01-23 13:21
zhi890130
Rank: 2
等 级:论坛游民
帖 子:6
专家分:17
注 册:2011-1-21
收藏
得分:0 
楼主为什么调试会发生错误呢?
2011-01-23 14:11
zhi890130
Rank: 2
等 级:论坛游民
帖 子:6
专家分:17
注 册:2011-1-21
收藏
得分:0 
楼主,那个malloc函数需要强制类型转换的
2011-01-23 14:26
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
以下是引用马后炮在2011-1-23 12:31:40的发言:

不敢,不敢,我的水平还没到那个档次
我怎么感觉你是在讽刺我,
从你楼下的那个SB的回帖,越发的证明了我的感觉是对的。/

我就是真命天子,顺我者生,逆我者死!
2011-01-23 17:09
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:17 
代码长,算法慢。

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2011-01-23 21:03
zdyzhang
Rank: 9Rank: 9Rank: 9
来 自:栖息地
等 级:蜘蛛侠
威 望:4
帖 子:2335
专家分:1227
注 册:2008-9-20
收藏
得分:17 
楼上,一票难求。

悲剧源于生活。
2011-01-23 21:38
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
谁喷粪让谁咽回去,

我就是真命天子,顺我者生,逆我者死!
2011-01-24 09:15
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
有胆量就写个不烂的代码我看看, 是不是有资格跟我叫板,

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



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

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