LV 八皇后

#include <iostream>
#include <vector>
#include <stack>
#include<cstdlib>
#define queenCount 16
#define maxTryCount 1000000
#define  intMaxValue 2147483647
#define  exeCount  1000//每个stepVegas执行exeCount次对比
using namespace std;
int tryPosition[queenCount+1];
bool contains(vector<int> temp,int val)
    {for(int i=0;i<temp.size();i++)
        {if(val==temp[i])
            {return true;
            }
        }
     return false;
    }
void backTrace(int k,vector<int> col,vector<int> diag45,vector<int> diag135,int &success,int &count)
    {stack<int> columnAssembly;
    int i=k;//k belongs to [1,queenCount]
    int j=1;
    while(i<=queenCount)
        {
        while(j<=queenCount)
            {if((!contains(col,j))&&(!contains(diag45,j-i))&&(!contains(diag135,j+i)))
                {
                columnAssembly.push(j);
                tryPosition[i]=j;
                col.push_back(j);
                diag45.push_back(j-i);
                diag135.push_back(j+i);
                i++;
                j=1;
                break;
                }
             j++;
             count++;
            }

         if(j>queenCount)
            {
            i--;
            if(i<k)//can't find positions to lay queens in security.
                {success=0;
                return;
                }
             col.pop_back();
             diag45.pop_back();
             diag135.pop_back();
             j=columnAssembly.top()+1;
             columnAssembly.pop();
            }

        }
        success=1;

    }
void QueensLv(int &success,int &count,int stepVegas)
    {vector<int> col;
     vector<int> diag45;
     vector<int> diag135;
     int k=0;// the number of row

     int nb;//the number of position that queen can be laid.
        do{
        nb=0;
        int j=1;
        for(int i=1;i<=queenCount;i++)//i is column
            {if((!contains(col,i))&&(!contains(diag45,i-k-1))&&(!contains(diag135,i+k+1)))//
                {nb=nb+1;
                 if(rand()%nb+1==1)
                    j=i;
                }
             count++;

            }
        if(nb>0)
            {k=k+1;
            tryPosition[k]=j;
            col.push_back(j);
            diag45.push_back(j-k);
            diag135.push_back(j+k);

            }

        }while((0!=nb)&&(stepVegas!=k));
    if(nb>0)
        backTrace(k+1,col,diag45,diag135,success,count);
    else
        success=0;

    }
int main()
{srand(time(0));

 int stepVegasExeCount[queenCount+1];
 for(int stepVegas=1;stepVegas<=queenCount;stepVegas++)//Don't include the case that pure backtrace,due to the restriction of implementation of queenslv.
     {stepVegasExeCount[stepVegas]=0;//When stepVegas's value is queenCount,it represents the case of pure LV.

      for(int i=0;i<exeCount;i++)
        { int success=0;
          int queenLvExeCount=0;
         while(1!=success&&maxTryCount!=queenLvExeCount)//if stepVegas is too large,the probability of failure will be large
            {
            QueensLv(success,stepVegasExeCount[stepVegas],stepVegas);
            queenLvExeCount++;
            }
//         if(maxTryCount==queenLvExeCount)
//            {stepVegasExeCount[stepVegas]=intMaxValue;
//
//            }
        }

        cout<<stepVegasExeCount[stepVegas]<<" ";

     }
 cout<<endl;
 int minStepVegasExeCount=intMaxValue;
 int bestStepVegas=-1;
 for(int stepVegas=1;stepVegas<=queenCount;stepVegas++)
    {if(stepVegasExeCount[stepVegas]<minStepVegasExeCount)
        {minStepVegasExeCount=stepVegasExeCount[stepVegas];
        bestStepVegas=stepVegas;
        }
    }
 cout<<"bestStepVegas:"<<bestStepVegas<<endl;



// int count=0;
// int queenLvExeCount=0;
// int success=0;
// while(1!=success&&maxTryCount!=queenLvExeCount)//if stepVegas is too large,the probability of failure will be large
//        {
//        QueensLv(success,count,15);
//        queenLvExeCount++;
//        }
// if(maxTryCount!=queenLvExeCount)
// {
//     cout<<queenLvExeCount<<endl;
//     for(int i=1;i<=queenCount;i++)
//        {
//        for(int j=1;j<=queenCount;j++)
//             {if(j==tryPosition[i])
//                cout<<"*"<<" ";
//              else
//                cout<<"-"<<" ";
//             }
//         cout<<endl;
//        }
// }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值