N皇后问题···帮我看下程序

N皇后问题···帮我看下程序,第1张

两条斜边你判断了吗?

下面我的AC代码,输入三个解和解数

#include<stdioh>

#include<stringh>

int usedl[60],usedr[60],usedrow[14],usedcol[14],queue[14],k,n,j,sum,sum1;

void DFS(int x)

{

int i,c;

if(x>n)

{

sum++;

if(j>3)

return;

printf("%d",queue[1]);

for(c=2;c<=n;c++)

printf(" %d",queue[c]);

printf("\n");

j++;

return ;

}

for(i=1;i<=n;i++)

{

if(usedl[i+x-1]==0&&usedr[n-x+i]==0&&usedrow[i]==0&&usedcol[x]==0)

{

queue[x]=i;

usedl[i+x-1]=usedr[n-x+i]=usedrow[i]=usedcol[x]=1;

DFS(x+1);

usedl[i+x-1]=usedr[n-x+i]=usedrow[i]=usedcol[x]=0;

queue[x]=0;

}

}

}

int main()

{

int i,t;

while(scanf("%d",&n)!=EOF)

{

sum=0;

k=1;

j=1;

memset(usedl,0,sizeof(usedl));

memset(usedr,0,sizeof(usedr));

memset(usedrow,0,sizeof(usedrow));

memset(usedcol,0,sizeof(usedcol));

if(n==6)

t=6;

else

t=n/2;

for(i=1;i<=t;i++)

{

memset(queue,0,sizeof(queue));

usedr[n-1+i]=usedrow[i]=usedcol[1]=usedl[i]=1;

queue[1]=i;

DFS(2);

usedr[n-1+i]=usedrow[i]=usedcol[1]=usedl[i]=0;

}

sum1=sum;

sum=0;

if(n%2==1)

{

memset(queue,0,sizeof(queue));

usedr[n-1+n-n/2]=usedrow[n/2+1]=usedcol[1]=usedl[n/2+1]=1;

queue[1]=n/2+1;

DFS(2);

}

if(n==6)

printf("%d\n",sum1);

else

printf("%d\n",sum12+sum);

}

return 0;

}

#include<iostreamh>

#include<timeh>

#include<mathh>

long sum=0;

int count=0;

int place(int k,intp)

{

for(int j=1;j<k;j++)

if((abs(k-j)==abs(p[j]-p[k]))||(p[j]==p[k])) return 0;

return 1;

}

void backtrack(intp,int n)

{

p[1]=0;

int k=1;

while(k>0){

p[k]+=1;

while((p[k]<=n)&&!(place(k,p))){p[k]+=1;count++;}

if(p[k]<=n)

if(k==n) sum++;

else{

k++;

p[k]=0;

}

else k--;

}

}

void main()

{

int n,p;

clock_t start,end;

cout<<"输入皇后的个数,n=";

cin>>n;

p=new int[n+1];

for(int i=0;i<=n;i++) p[i]=0;

start=time(0);

backtrack(p,n);

end=time(0);

cout<<"经过时间:"<<difftime(end,start)<<"秒"<<endl

<<"有"<<sum<<"种方案!"<<endl

<<"搜索结点次数为:"<<count<<endl;

}

//改动n的值变成n皇后问题

#include<iostreamh>

const int n = 8 ; //8皇后问题改动n可变成N皇后问题

const int n_sub = n - 1 ;

int queen[n] ; //N个棋子N对应每一列,如n=0的棋子只下在0列,1下1类推

bool row[n] ; //棋局的每一行是否有棋,有则为1,无为0 ;

bool passive[2n-1] ; //斜率为1的斜线方向上是不是有皇后

bool negative[2n-1] ; //斜率为负1的斜线方向上是不是有皇后

//之所以用全局变量,因全局数组元素值自动为0

int main()

{

int cur = 0 ;//游标,当前移动的棋子(哪一列的棋子)

bool flag = false ; //当前棋子位置是否合法

queen[0] = -1 ; //第0列棋子准备,因一开始移动的就是第0列棋子

int count = 0 ; //一共有多少种下法 ;

cout<<"开始!若n较大,运行很慢"<<endl ;

while(cur>=0)

{

while(cur>=0 && queen[cur]<n && !flag) //当还不确定当前位置是否可下

{

queen[cur]++ ;

// cout<<"第"<<cur<<"列棋子开始走在第"<<queen[cur]<<"行"<<endl ;

// cinget() ;

if(queen[cur] >= n) { //如果当前列已经下完(找不到合法位置)

// cout<<"当前行是非法行,当前列棋子走完,没有合法位置,回溯上一列棋子"<<endl ;

// cinget() ;

queen[cur] = -1 ; //当前列棋子置于准备状态

cur-- ; //回溯到上一列的棋子

if(cur>=0) {

row[queen[cur]] = false ;

passive[queen[cur] + cur] = false ;

negative[n_sub + cur - queen[cur]] = false ;

}

//由于要移下一步,所以回溯棋子原位置所在行应该没有棋子啦置row[]为false

//并且棋子对应的斜线的标志位passive[cur]和negative[cur]也应该要设为false ;

}

else {

//先判断棋子所在行没有棋子

if(row[queen[cur]] == false) { //当前行没有棋子

// cout<<"棋子"<<cur<<"所在行没有其他棋子,正在检查斜线"<<endl ;

flag = true ; // 暂设为true,或与之前棋子斜交,则再设为false ;

//以下检查当前棋子是否与之前的棋子斜线相交

if( passive[queen[cur] + cur] == true || negative[n_sub + cur - queen[cur]] == true) {

flag = false ;

// cout<<"出现斜线相交,该位置不合法"<<endl ;

}

else

flag = true ;

if(flag) { //没有斜交,位置合法

// cout<<"斜线也没有相交,该位置合法"<<endl ;

if(cur == n-1) //如果是最后一个棋子

{

// cout<<"棋子走完一轮,总走法加1"<<endl ;

count++ ; //总走法加一 ;

}

row[queen[cur]] = true ;// 当前行设为有棋子

passive[queen[cur] + cur] = true ;//当前行正斜率方向有棋子

negative[n_sub + cur - queen[cur]] = true ; //当前行负斜率方向上也有棋子

cur++ ;

if(cur >= n) {

cur-- ;

row[queen[cur]] = false ;

passive[queen[cur] + cur] = false ;

negative[n_sub + cur - queen[cur]] = false ;//原理同回溯

}

flag = false ;

}

}

}//else

}

}

cout<<n<<"皇后问题一共有"<<count<<"种解法"<<endl ;

return 0 ;

}

以上就是关于N皇后问题···帮我看下程序全部的内容,包括:N皇后问题···帮我看下程序、8皇后问题 分支界限法 的详细解释 (已经附程序)、C++:用分支界限法解决n皇后问题(急)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9758595.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存