两条斜边你判断了吗?
下面我的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皇后问题(急)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)