数据结构之回溯法

来源:互联网 发布:巴西衰落知乎 编辑:程序博客网 时间:2024/04/24 12:12
数据结构书上讲了下回溯法,于是在hdu找了个题目:HDU 2553 N皇后问题
http://acm.hdu.edu.cn/showproblem.php?pid=2553
// 采用深度搜索的方式进行搜索,每次放置一个皇后是都得用check()函数进行判断,要是可以放下去,则皇后数目加一,继续进行深度搜索 
//这里采用的不是传统的二维数组,而是一位数组 queen[n] = i;其中n是行的数目,也是皇后的数目,i是列的数目 
//这题还有一个特点是测试的数据特别多,因此如果不将第一次获得的数据保存在数组中的话,下次则还要重新计算,绝对会超时 

#include <stdio.h>#include <stdlib.h>int queen[11], sum=0; int method[11]={0};int m;  int check(int n){     int i;    for(i = 0; i < n; i++){        //列和对角线的检查         if(queen[i] == queen[n] || abs(queen[i] - queen[n]) == (n - i)){                   return 1;        }    }    return 0;}void put(int n){     int i;    for(i = 0; i < m; i++){                   queen[n] = i;         if(!check(n)){                              if(n == m - 1){                            sum++;             }                     else{                            put(n + 1);             }        }    }}int main(){    while(scanf("%d",&m),m!=0){        sum=0;        if(method[m]!=0)            printf("%d\n",method[m]);        else{            put(0);            method[m]=sum;             printf("%d\n", sum);           }          }    return 0;} 
复制代码

原创粉丝点击