再次优化过的8皇后问题

其实我没有做到记忆一些已经判定过的状态,增加trace来记忆已判定状态,去掉重复判断

#include <stdio.h>

#define N 9
int q[N] = {0};
int not_end = 1;
int trace = 0;
int cnt = 0;
int sum = 0;

void print_q() {
    int i;

    for (i=0; i<N; i++) printf("%d ", q[i]);

    printf("\n");

    return;
}

int can_put(int m, int n) {
    int i,j;

    sum++;

    //row is ok
    //colume
    for (i=0; i<m; i++) {
        if (q[i] == n) return 0;
    }

    //left-up
    for (i=m-1,j=n-1; i>=0 && j>=0; i--,j--) {
        if (q[i] == j) return 0;
    }

    //right-up
    for (i=m-1,j=n+1; i>=0 && j<N; i--,j++) {
        if (q[i] == j) return 0;
    }

    return 1;
}

void next_qn() {
    while (trace >= 0) {
        if (q[trace] < N-1) {
            q[trace] +=1;
            break;
        }

        q[trace] = 0;
        trace--;
    }

    if ( trace < 0) {
        not_end = 0;
    } else {
        int i = trace + 1;
        while (i < N) {
            q[i] = 0;
            i++;
        }
    }

    return;
}

int main(int argc, char* argv[]) {
    while (not_end) {
        int i;

        for (trace; trace<N; trace++) {
            if (!can_put(trace, q[trace])) break;
        }

        if (trace == N) {
            cnt++;
            //print_q();
            trace--;
            next_qn(N-1);
        } else {
            next_qn();
        }
    }

    printf("CNT: %d, times: %d\n", cnt, sum);

    return 0;
}

再次执行就好看多了

CNT: 352, times: 72378

real    0m0.007s
user    0m0.004s
sys    0m0.000s

我们可以看到判定次数已经和递归一样,也就是说已经成功的用循环替代了递归,并且执行的时间少了0.001s,这大概是省在来回搬栈上了。

大概这是我的最终答案了,找时间去网上找找经典问题的经典解,或许能学到更有趣的事情。

时间: 2024-12-09 14:15:20

再次优化过的8皇后问题的相关文章

【小白到大牛之路12】交换机后台管理之端口管理的再次优化

项目12交换机后台管理之端口管理的再次优化项目精讲 1.为什么要使用指针 函数的值传递,无法通过调用函数,来修改函数的实参. 2.指针定义 指针是什么 指针本质是一个地址值: #include <stdio.h> int main(void){ int age; //定义了一个指针 //指针是一个变量 //这个变量的名称是 p //这个指针,可以用来指向一个整数! //就是说:p的值是一个整数的地址!!! int * p; //指针p指向了age //p的值,就是变量age的地址 p = &a

再次优化NGINX+php-fpm上传

上次写了一篇nginx+php-fpm优化上传,一位博友留言介绍了,第三方nginx upload module http://www.grid.net.ru/nginx/upload.en.html 看了一下,功能蛮强大的,所以就记录下来·基本没什么变化,在原有的例子上稍加了下修改,加了一个限速功能.在 0.8.X 版本上编译出出错,他官方也有写: For nginx versions other than 0.7.44-51 但是我在最新版本 nginx-0.7.67.tar.gz 编译也没

openvpn的tap模式下server.conf再次优化

最近在看openvpn的源代码发现了一个问题其实如果是在用tap模式下其实不用那么麻烦一样可以找到最优的方法让客户端与服务端的子网进行路由通信,如果是用openvpn的tap模式只要在服务器上让客户端推送服务器子网的网段的路由就行了,可以完美适配各种网段的客户端实现拨号以以前的http://jim123.blog.51cto.com/4763600/1839992和http://jim123.blog.51cto.com/4763600/1840426为例 #push "redirect-gat

JGUI源码 鼠标中键滚动再次优化

var startmousewheeldatetime = (new Date()).valueOf(); //电脑端中键滚动事件 var mousewheel = getBrowserInfo() == "Firefox" ? "DOMMouseScroll" : "mousewheel"; $('.jgui-accordion').on(mousewheel, function (event) { startmousewheel = (new

Eclipse4.7使用基础 快捷键 ctrl+shift+f 优化代码的格式

os :windows7 x64    jdk:jdk-8u131-windows-x64    ide:Eclipse Oxygen Release (4.7.0) ctrl+shift+f 可以经常按一下,挺好用的.普通的快捷键. 给最苦 就不做普通的情况展示了,下面要展示的是特殊情况,失效的快捷键 初始状态 使用快捷键后的代码排版 可以看到的是,优化排版的效果也并非十全十美,一些"太强悍"的格式不能纠正.这也要求,优秀的代码格式要自己注意培养! 手工再次优化排版 Java优秀,值

Android高手进阶——Adapter深入理解与优化

Android高手进阶--Adapter深入理解与优化 通常是针对包括多个元素的View,如ListView,GridView.ExpandableListview,的时候我们是给其设置一个Adapter.Adapter是与View之间提供数据的桥梁,也是提供每一个Item的视图桥梁.   以ListView为例.其工作原理为: ● ListView针对List中每一个item, adapter都会调用一个getView的方法获得布局视图 ●我们通常会Inflate一个新的View,填充数据并返

SQL SERVER全面优化-------索引有多重要?

想了好久索引的重要性应该怎么写?讲原理结构?我估计大部分人不愿意看,也不愿意花那么多时间仔细研究.光写应用?感觉不明白原理一样不会用.举例说明?情况太多也写不全....到底该怎么写呢? 随便写吧,想到哪写到哪!  前面很多篇不管CPU.内存.磁盘.语句等等等都提到了索引的重要,我想刚刚开始学数据库的在校学生都知道索引对语句性能的重要性.但他们可能不知道,对语句的重要性就是对系统的重要性! 抛出一个问题 :你相信一条语句就能让你的大系统挂掉么? 带着问题,首先还是贴出我的座驾 最近不太喜欢红色换了

java应用程序及服务器优化过程及loadrunner测试效果

我们目前的网站应用首页大小在130K左右,在之前的测试过程中,其百用户并发的平均响应能力在6.5秒,通过今天的性能优化大概提升两秒左右的时间,结果在5秒内,根据应用的技术及操作系统环境,已经达到最优了,但再次优化的可能性还是有的,详细信息如下: 一.操作系统: 机器名    CPU    内存    软件环境(操作系统/应用软件)    备注应用服务器    3.07GHz*2    8GB    Linux    1台应用服务器(虚拟机)测试机    2.50GHz    4GB    WIN

springboot启动太慢优化

需求缘起:有人在[springboot]微信公众号问:springboot启动慢的问题何时有个分享就好了,谢谢.粉丝的问题还是要认真的回答的. 我们先看看本节的大纲: (1)组件自动扫描带来的问题(@SpringBootApplication):(2)如何避免组件自动扫描带来的问题(不使用@ SpringBootApplication):(3)引发的问题--无法扫描组件:(4)千古红楼只一梦,竹篮打水一场空:(5)debug debug,bug bug更健康:(6)分析Positive matc