免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1133 | 回复: 2
打印 上一主题 下一主题

代码优化问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-05-08 09:17 |只看该作者 |倒序浏览
问题:
    在国际象棋棋盘上,找一种马的走法,使它能走到每一个格子,且每个格子
    只能走一次。
我写了个垃圾代码,在我的赛扬cpu上运行了10多秒才出来结果。请高手帮我优化
一下。









#include <stdio.h>
#include <stdlib.h>
#define SIZE 8



typedef struct point
{
        int x;
        int y;
}Point;



int board[SIZE][SIZE];
int n=1;
Point movepoint;


void printboard(void)
{
        for(int i=0;i<SIZE;i++)
        {
                for(int j=0;j<SIZE;j++)
                        printf("%5d",board[i][j]);
                printf("\n");
        }
}
void findroad()
{
        for(int i=-2;i<=2;i++)
                for(int j=-2;j<=2;j++)    //这里怎么优化?
                if(  abs(i)+abs(j)==3  &&  movepoint.x+i>=0  &&  movepoint.y+j>=0
                     &&  movepoint.x+i<SIZE  &&  movepoint.y+j<SIZE  &&  board[movepoint.x+i][movepoint.y+j]==0)
                {
                        movepoint.x+=i;
                                movepoint.y+=j;
                                n++;
                                board[movepoint.x][movepoint.y]=n;
                                if(n==SIZE*SIZE)
                                {
                                        printboard();
                                        exit(0);
                                }
                                else
                                        findroad();
                                board[movepoint.x][movepoint.y]=0;
                                movepoint.x-=i;                               
                                movepoint.y-=j;
                                n--;

                }
}




int main(int argc, char *argv[])
{
        for(int i=0;i<SIZE;i++)
                for(int j=0;j<SIZE;j++)
                board[i][j]=0;
        movepoint.x=0;
        movepoint.y=0;
        board[0][0]=1;
        findroad();
        return 0;
}

论坛徽章:
0
2 [报告]
发表于 2006-05-11 11:49 |只看该作者
顶上求助

论坛徽章:
0
3 [报告]
发表于 2006-05-11 12:08 |只看该作者
回朔法本身就比较麻烦。
算法上偶很菜,从代码上给点参考。
abs(i)+abs(j)==3 这段可以去掉。
I J改成配对的数组
int point[8][2]={{-2,-1},{-2,1},{-1,-2},{-1,2},{2,-1},{2,1},{1,-2},{1,2}};
这样2个循环可以用1个循环来表示  abs(i)+abs(j)==3 也可以去掉。

另外如下几个判断顺序可以调整一下。
1,边缘判断。由于运行过程中到达边缘状态比较少(相对中心点),所以边缘状态要尽量放判断后面。提前做是否走过判断。
这样修改算法后,需要对board进行边缘扩展防止board[movepoint.x+i][movepoint.y+j] 异常。
2。movepoint.x+i 最好在前面做好,不要在判断中都做加法,我不确定编译器是否能够优化掉。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP