数据结构之回溯法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xie_dream/article/details/7934189
数据结构书上讲了下回溯法,于是在hdu找了个题目:HDU 2553 N皇后问题
// 采用深度搜索的方式进行搜索,每次放置一个皇后是都得用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;
} 
复制代码

没有更多推荐了,返回首页