KOBOSP

导航

经典例题----八皇后问题(回溯)

题目简介:在8*8的国际象棋棋盘上,要求在每一行(或者每一列)放置一个皇后,且能做到在水平方向、竖直方向和斜方向都没有冲突。请列出所有解法。

思考方向:根据规则,设置数组colume[7],数组下标为列值,该数组中存放的是行值 ,

      可以得到    一、colume[前所有列]  !=colume[当前所求列]

           二、abs { colume[前所有列] — colume[当前所求列] } !=abs { 前所有列—当前所求列 }

解题步骤:一、从第一列开始,调用QueenSolution(),依次将前几列所得的结果与当前所在列尝试使用的行进行比较;

     二、如果合法,则将当前位置入栈,递归调用下一列的QueenSolution();

     三、直到所有列已经得到合法的位置,则调用printResult()函数打印,同时将最后一列的行出栈,继续尝试下一行的位置,循环。

解题代码:

#include <iostream>  
#include <cmath>  

#define QUEEN_NUM 8  
int ResultCounter = 0;

void printResult(int colume[]);
bool check(int colume[], int col);
void QueenSolution(int colume[], int col);

int main(void) 
{
    //数组colume中存放的是行值  
    //即假设col[0]==3,表明第1列中皇后在第4行上  
    int colume[QUEEN_NUM] = { 0 };
    QueenSolution(colume, 0);
    std::cout << "Solution Total Count: " << ResultCounter << std::endl;
    return 0;
}


//输出数组中的一组结果  
void printResult(int colume[]) 
{
    for (int i = 0; i < QUEEN_NUM; i++)
        std::cout << "(" << colume[i] << ", " << i << ") ";
    std::cout << std::endl;
    ResultCounter++;
}

//检查当前列col,在现有情况下,能否放置皇后  

bool check(int colume[], int col) 
{
    for (int i = 0; i < col; i++)
    {
        if (colume[i] == colume[col] ||
            std::abs(colume[i] - colume[col]) == col - i)
            return false;
    }
    return true;
}

//尝试第col列上的所有解  
//即在第col列的所有行上依次检验  
//调用此函数时,表明从第0列到第col-1列都已经安置好了皇后  
void QueenSolution(int colume[], int col) 
{
    if (col == QUEEN_NUM)
    {
        printResult(colume);
        return;
    }

    //新的一列中,皇后有可能在任意一行  
    for (int i = 0; i < QUEEN_NUM; i++)
    {
        colume[col] = i;  //将这个皇后放在第i行,进行检查  
        if (check(colume, col))
            QueenSolution(colume, col + 1);
    }
}

部分答案:

          

 杂七杂八:

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <ctype.h>

int main() {
    int a,flag=0;
    char s[40];
    const char *sep=".";
    char *p;
    while(scanf("%s",&s)!=EOF){
        flag=0;
        p=strtok(s,sep);
        while(p){
            if(isdigit(*p)){//头文件是ctype.h(c),cctype(c++);
                sscanf(p,"%d",&a);//#include <stdio.h>
                if(a<0||a>255){
                    flag=1;
                    break;2
                }
            }
            else{
                flag=1;
                break;
            }
            p=strtok(NULL,sep);//只能判断一位 <string.h
        }
        if(flag==0)
            printf("Y\n");
        else
            printf("N\n");
    }
    return 0;
}

 

posted on 2018-01-21 20:39  KOBOSP  阅读(945)  评论(0)    收藏  举报