经典的八皇后问题,此题要求和。
用的c++
c,d数组判断对角线,a[0][]判断此列是否有皇后,只有满足三个条件才能算找到,a[][0]判断此行皇后在哪
核心代码中
分别判断1.如果没找到(y==9)回溯;2.在最后一行找到了,存储记录数据,回溯;3.普通找到,继续执行
缺点就是作为萌新代码冗杂。。。
---------------------------------
#include <iostream>
#include <iomanip>using namespace std;
int queen(int b[][10])
{
int sum[99]={0};
int a[10][10]={0};
int c[16]={0},d[16]={0};
int t=0,x,y;
for(x=1;x<=8;x++)
{
/*if(t==92)
{
break;
}*/
【if(flag==1)
{
break;
}】
{
【if(a[1][0]==8)
{
if(x==2&&y==7)
{
flag=1;
break;
}
}】
if(y==9)
{x--;
int k=a[x][0];
a[0][k]=0;c[x+k]=0;d[x-k+8]=0;sum[t]-=b[x][k];a[x+1][0]=0;
x--;
break;
}
if(a[0][y]==0&&c[x+y]==0&&d[x-y+8]==0&&x==8)
{
sum[t+1]=sum[t];sum[t]+=b[x][y];t++;
x--;
int k=a[x][0];
a[0][k]=0;c[x+k]=0;d[x-k+8]=0;a[x+1][0]=0;sum[t]-=b[x][k];
x--;
break;
}
if(a[0][y]==0&&c[x+y]==0&&d[x-y+8]==0&&x!=8)
{
a[0][y]++;a[x][0]=y;c[x+y]++;d[x-y+8]++;sum[t]+=b[x][y];
break;
}
}
}
int i2,max1=0;
for(i2=0; i2<=91; i2++)
{
if(sum[i2]>max1)
max1=sum[i2];
}
return max1;
}
int main()
{
int k,i,i2;
cin>>k;
for(i=0; i<k; i++)
{
int b[10][10]={0};
int max1=0;
int i1,j1;
for(i1=1; i1<=8; i1++)
for(j1=1; j1<=8; j1++)
cin>>b[i1][j1];
max1=queen(b);
cout<<setw(5)<<max1<<endl;
}
return 0;
}
----------------------------------
这道题卡了好几天,最后人工检查debug也是差点让橡皮擦破了草稿纸。。。
感悟:
1.二维数组传进函数需要[][确定是几位];
2.不加第10行的那个if会造成崩溃,容我再想想为啥。。。
3.到第八行找到的时候新sum为了回溯要减去原sum第八行和第七行。。。
4.回溯的时候居然还x++,我还要x--两遍(sad),同学说用while不用for会好一些。。。
----
5.改进了2的问题,删除了/**/的代码,加入了【】的两处代码