c++回溯问题,求大神帮助解决
#include<cstdio>#include<cstring>usingnamespacestd;//变量定义intn,cnt=0;inta[30][30]={0};...
#include<cstdio>
#include<cstring>
using namespace std;
//变量定义
int n,cnt=0;
int a[30][30]={0};//int v1[30]={0},v2[30]={0},v3[30]={0};
//函数定义
int cheak(int,int);
void zhanl(int,int);
void shif(int,int);
void dfs(int);
//main操作
void readdata()
{
scanf("%d",&n);
}
void work()
{
dfs(1);
printf("%d",cnt);
}
int main()
{
readdata();
work();
while(1);
return 0;
}
void dfs(int k)
{
if(k>n){cnt++;return;}
for(int i=1;i<=n;i++)
{
if(cheak(k,i)!=0) //if(!v1[i]&&!v2[k+i]&&!v3[k-i+n])
{
zhanl(k,i); //v1[i]=v2[k+i]=v3[k-i+n]=1;
dfs(k+1); //dfs(k+1);
shif(k,i); //v1[i]=v2[k+i]=v3[k-i+n]=0;
}
}
}
int cheak(int k,int i)
{
for(int j=1;j<=n;j++)if(a[j][i]!=0)return 0;
for(int j=k-1,m=i+1;j>0,m<=n;j--,m++)if(a[j][m]!=0)return 0;
for(int j=k+1,m=i-1;j<=n,m>0;j++,m--)if(a[j][m]!=0)return 0;
for(int j=k-1,m=i-1;j>0,m>0;j--,m--)if(a[j][m]!=0)return 0;
for(int j=k+1,m=i+1;j<=n,m<=n;j++,m++)if(a[j][m]!=0)return 0;
return 1;
}
void zhanl(int k,int i)
{
for(int j=1;j<=n;j++)a[j][i]=1;
for(int j=k-1,m=i+1;j>0,m<=n;j--,m++)a[j][m]=1;
for(int j=k+1,m=i-1;j<=n,m>0;j++,m--)a[j][m]=1;
for(int j=k-1,m=i-1;j>0,m>0;j--,m--)a[j][m]=1;
for(int j=k+1,m=i+1;j<=n,m<=n;j++,m++)a[j][m]=1;
}
void shif(int k,int i)
{
for(int j=1;j<=n;j++)a[j][i]=0;
for(int j=k-1,m=i+1;j>0,m<=n;j--,m++)a[j][m]=0;
for(int j=k+1,m=i-1;j<=n,m>0;j++,m--)a[j][m]=0;
for(int j=k-1,m=i-1;j>0,m>0;j--,m--)a[j][m]=0;
for(int j=k+1,m=i+1;j<=n,m<=n;j++,m++)a[j][m]=0;
}
用dsf做的,判断·占领·释放都用的函数,编译器说内存不能为written
这是n皇后问题 展开
#include<cstring>
using namespace std;
//变量定义
int n,cnt=0;
int a[30][30]={0};//int v1[30]={0},v2[30]={0},v3[30]={0};
//函数定义
int cheak(int,int);
void zhanl(int,int);
void shif(int,int);
void dfs(int);
//main操作
void readdata()
{
scanf("%d",&n);
}
void work()
{
dfs(1);
printf("%d",cnt);
}
int main()
{
readdata();
work();
while(1);
return 0;
}
void dfs(int k)
{
if(k>n){cnt++;return;}
for(int i=1;i<=n;i++)
{
if(cheak(k,i)!=0) //if(!v1[i]&&!v2[k+i]&&!v3[k-i+n])
{
zhanl(k,i); //v1[i]=v2[k+i]=v3[k-i+n]=1;
dfs(k+1); //dfs(k+1);
shif(k,i); //v1[i]=v2[k+i]=v3[k-i+n]=0;
}
}
}
int cheak(int k,int i)
{
for(int j=1;j<=n;j++)if(a[j][i]!=0)return 0;
for(int j=k-1,m=i+1;j>0,m<=n;j--,m++)if(a[j][m]!=0)return 0;
for(int j=k+1,m=i-1;j<=n,m>0;j++,m--)if(a[j][m]!=0)return 0;
for(int j=k-1,m=i-1;j>0,m>0;j--,m--)if(a[j][m]!=0)return 0;
for(int j=k+1,m=i+1;j<=n,m<=n;j++,m++)if(a[j][m]!=0)return 0;
return 1;
}
void zhanl(int k,int i)
{
for(int j=1;j<=n;j++)a[j][i]=1;
for(int j=k-1,m=i+1;j>0,m<=n;j--,m++)a[j][m]=1;
for(int j=k+1,m=i-1;j<=n,m>0;j++,m--)a[j][m]=1;
for(int j=k-1,m=i-1;j>0,m>0;j--,m--)a[j][m]=1;
for(int j=k+1,m=i+1;j<=n,m<=n;j++,m++)a[j][m]=1;
}
void shif(int k,int i)
{
for(int j=1;j<=n;j++)a[j][i]=0;
for(int j=k-1,m=i+1;j>0,m<=n;j--,m++)a[j][m]=0;
for(int j=k+1,m=i-1;j<=n,m>0;j++,m--)a[j][m]=0;
for(int j=k-1,m=i-1;j>0,m>0;j--,m--)a[j][m]=0;
for(int j=k+1,m=i+1;j<=n,m<=n;j++,m++)a[j][m]=0;
}
用dsf做的,判断·占领·释放都用的函数,编译器说内存不能为written
这是n皇后问题 展开
2个回答
展开全部
C++么为什么要用C的库 嘞 疑问,C语言实现八皇后问题
01 #include <stdio.h>
02 #include <math.h> /*包含math.h头文件*/
03 int f(int x[],int n) /*自定义函数f()*/
04 {
05 int i;
06 for(i=1;i<=n-1;i++)
07 if((abs(x[i]-x[n])==abs(i-n))||(x[i]==x[n])) /*比较是否满足条件*/
08 return 0; /*若不满足条件返回0*/
09 return 1; /*若满足条件返回1*/
10 }
11 void main()
12 {
13 int x[9],i; /*定义整型数组x和整型变量i*/
14 for(x[1]=1;x[1]<=8;x[1]=x[1]+1) /*第一层for循环*/
15 for(x[2]=1;x[2]<=8;x[2]=x[2]+1) /*第二层for循环*/
16 {
17 if(f(x,2)==0) /*调用函数f()*/
18 continue;
19 for(x[3]=1;x[3]<=8;x[3]=x[3]+1) /*第3层for循环*/
20 {
21 if(f(x,3)==0) /*调用函数f()*/
22 continue;
23 for(x[4]=1;x[4]<=8;x[4]=x[4]+1) /*第4层for循环*/
24 {
25 if(f(x,4)==0) /*调用函数f()*/
26 continue;
27 for(x[5]=1;x[5]<=8;x[5]=x[5]+1) /*第5层for循环*/
28 {
29 if(f(x,5)==0) /*调用函数f()*/
30 continue;
31 for(x[6]=1;x[6]<=8;x[6]=x[6]+1) /*第6层for循环*/
32 {
33 if(f(x,6)==0) /*调用函数f()*/
34 continue;
35 for(x[7]=1;x[7]<=8;x[7]=x[7]+1) /*第7层for循环*/
36 {
37 if(f(x,7)==0) /*调用函数f()*/
38 continue;
39 for(x[8]=1;x[8]<=8;x[8]=x[8]+1) /*第8层for循环*/
40 {
41 if(f(x,8)==0) /*调用函数f()*/
42 continue;
43 else
44 for(i=1;i<=8;i++) /*输出所有可能的结果*/
45 {
46 printf("%d",x[i]);
47 if(i==8)
48 printf("\n");
49 }}}}}}}}}
01 #include <stdio.h>
02 #include <math.h> /*包含math.h头文件*/
03 int f(int x[],int n) /*自定义函数f()*/
04 {
05 int i;
06 for(i=1;i<=n-1;i++)
07 if((abs(x[i]-x[n])==abs(i-n))||(x[i]==x[n])) /*比较是否满足条件*/
08 return 0; /*若不满足条件返回0*/
09 return 1; /*若满足条件返回1*/
10 }
11 void main()
12 {
13 int x[9],i; /*定义整型数组x和整型变量i*/
14 for(x[1]=1;x[1]<=8;x[1]=x[1]+1) /*第一层for循环*/
15 for(x[2]=1;x[2]<=8;x[2]=x[2]+1) /*第二层for循环*/
16 {
17 if(f(x,2)==0) /*调用函数f()*/
18 continue;
19 for(x[3]=1;x[3]<=8;x[3]=x[3]+1) /*第3层for循环*/
20 {
21 if(f(x,3)==0) /*调用函数f()*/
22 continue;
23 for(x[4]=1;x[4]<=8;x[4]=x[4]+1) /*第4层for循环*/
24 {
25 if(f(x,4)==0) /*调用函数f()*/
26 continue;
27 for(x[5]=1;x[5]<=8;x[5]=x[5]+1) /*第5层for循环*/
28 {
29 if(f(x,5)==0) /*调用函数f()*/
30 continue;
31 for(x[6]=1;x[6]<=8;x[6]=x[6]+1) /*第6层for循环*/
32 {
33 if(f(x,6)==0) /*调用函数f()*/
34 continue;
35 for(x[7]=1;x[7]<=8;x[7]=x[7]+1) /*第7层for循环*/
36 {
37 if(f(x,7)==0) /*调用函数f()*/
38 continue;
39 for(x[8]=1;x[8]<=8;x[8]=x[8]+1) /*第8层for循环*/
40 {
41 if(f(x,8)==0) /*调用函数f()*/
42 continue;
43 else
44 for(i=1;i<=8;i++) /*输出所有可能的结果*/
45 {
46 printf("%d",x[i]);
47 if(i==8)
48 printf("\n");
49 }}}}}}}}}
追问
我是问为什么我错在哪里。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询