| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2611 人关注过本帖
标题:哪位大神帮我解决下怎样才能避免重复走到相同的方块?下面运行的结果没有回 ...
只看楼主 加入收藏
朽神
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2016-6-17
收藏
 问题点数:0 回复次数:2 
哪位大神帮我解决下怎样才能避免重复走到相同的方块?下面运行的结果没有回溯。
#include<stdio.h>
#define N 8
typedef struct
{
    int i1;
    int j1;
    int di1;
}Box;
typedef struct
{
    int top;
    Box data[N*N];
}sqstack;
int Board[N][N]={0};
bool hourse(int Board[N][N],int x,int y)
{
    int i,j,k=1,di, find;
    sqstack st;
    st.top=-1;
    st.top++;
    st.data[st.top].i1=x;//保存行号
    st.data[st.top].j1=y;//保存列号
    st.data[st.top].di1=-1;//保存所走的路径
    Board[x][y]=k;
    while(st.top>-1)//栈不为空时
    {
        i=st.data [st.top].i1;
        j=st.data [st.top].j1;
        di=st.data[st.top].di1;
        find=0;
        if(k==64)
            return true;
        while(di<7&&find==0)
        {
            di++;
            switch(di)
            {
            case 0:i=st.data[st.top].i1-2;
                   j=st.data[st.top].j1-1;
                   if(i<0||i>=N||j<0||j>=N)
                        di++;
                    else break;
            case 1:i=st.data[st.top].i1-2;
                   j=st.data[st.top].j1+1;
                   if(i<0||i>=N||j<0||j>=N)
                        di++;
                    else break;
            case 2:i=st.data[st.top].i1-1;
                   j=st.data[st.top].j1+2;
                   if(i<0||i>=N||j<0||j>=N)
                        di++;
                    else break;
            case 3:i=st.data[st.top].i1+1;
                   j=st.data[st.top].j1+2;
                   if(i<0||i>=N||j<0||j>=N)
                        di++;
                    else break;
            case 4:i=st.data[st.top].i1+2;
                   j=st.data[st.top].j1+1;
                   if(i<0||i>=N||j<0||j>=N)
                        di++;
                    else break;
            case 5:i=st.data[st.top].i1+2;
                   j=st.data[st.top].j1-1;
                   if(i<0||i>=N||j<0||j>=N)
                        di++;
                    else break;
            case 6:i=st.data[st.top].i1+1;
                   j=st.data[st.top].j1-2;
                   if(i<0||i>=N||j<0||j>=N)
                        di++;
                    else break;
            case 7:i=st.data[st.top].i1-1;
                   j=st.data[st.top].j1-2;
                   if(i<0||i>=N||j<0||j>=N)
                        di++;
                    else break;
            }
            if((Board[i][j])==0)find=1;//找到下一个可走的方块
        }
        if(find==1)
        {
            st.data[st.top].di1=di;
            st.top++;
            st.data[st.top].di1=-1;
            st.data[st.top].i1=i;
            st.data[st.top].j1=j;
            k++;
            Board[i][j]=k;
        }
        else
        {
            Board[st.data[st.top].i1][st.data[st.top].j1]=0;
            k--;
            st.top--;
        }
    }
    return false;
}
void main()
{
    int i,j,h,t;
    bool flag;
    printf("输入马踏遍开始的位置(0<i<%d,0<j<%d):\n",N,N);
    scanf("%d %d",&i,&j);
    flag=hourse(Board,i-1,j-1);
    if(flag==false)
    {   
        printf("马踏遍没有结果.\n");
    }
    else
    {
        printf("输出马踏过的结果:\n");
        for(t=0;t<N;t++)
        {
            for(h=0;h<N;h++)
            {
                printf("%d\t",Board[t][h]);
            }
            printf("\n");
        }
    }
}


2016-06-17 21:41
朽神
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2016-6-17
收藏
得分:0 
你这个结果有问题,他程序中已经有回溯了
2016-06-20 20:49
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
建立一个对应的数组作为标记,每到过一次这个位置,就把标记数加一,然后在每次要找位置进行遍历的时候只要判断该位置的标记情况就行了
式例:初始化一个a[5][5]的坐标地图,从a[2][2]开始遍历,
used[5][5]={0};
向上到a[2][1],这时对used[2][1]写入22,表示他从a[2][2]的位置来
顺时针对a[2][3]a[3][2]a[2][1]的标记used[][]也写入22.

当程序进入下一级的循环时比如以a[2][1]为核心进行遍历时,对于他的邻居的used[][]判断这个是不是22也就是起点 如果不是就说明可以收录,收录的同时写入本次遍历来源位置也就是21


------------------
我讲的很乱////但总的来说你的问题是“图的遍历”,建议你可以查一下“DFS(深度优先算法)”“ BFS(广度优先算法)”



φ(゜▽゜*)♪
2016-06-27 21:49
快速回复:哪位大神帮我解决下怎样才能避免重复走到相同的方块?下面运行的结果没 ...
数据加载中...
 
   



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

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