思路:先把所有情况存入sum[99][10]中,
其中前一个代表第多少种情况(反正就92组嘛~)
第二个代表第几行,数字代表皇后在该行第几列
最后在main里找到满足情况就输出
最后就是格式了...这一题的格式有个坑就是第几组数据可能要设定只输出两位...
还有就是每行一个回车,最后一行没回车
-------------------------------------------------
#include <iostream>
#include <iomanip>
using namespace std;
void queen(int sum[][10])
{
int a[10][10]= {0};
int c[16]= {0},d[16]= {0};
int t=0,x,y,flag=0;
for(x=1; x<=8; x++)
{
if(flag==1)
{
break;
}
for(y=a[x][0]+1; y<=9; y++)
{
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;
a[x+1][0]=0;
x--;
break;
}
if(a[0][y]==0&&c[x+y]==0&&d[x-y+8]==0&&x==8)
{
for(int i1=1; i1<=7; i1++)
{
sum[t][i1]=a[i1][0];
}
sum[t][8]=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;
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]++;
break;
}
}
}
}
int main()
{
int k,i;
int sum[99][10]= {0};
queen(sum);
cin>>k;
for(i=0; i<k; i++)
{
int x1,y1;
cin>>y1>>x1;
cout<<"SOLN COLUMN"<<endl<<" # 1 2 3 4 5 6 7 8\n\n";
int i1;
int m=0;
for(i1=0; i1<=91; i1++)
{
if(sum[i1][x1]==y1)
{
m++;
cout<<setw(2)<<m<<" ";
for(int i2=1; i2<=7; i2++)
{
cout<<sum[i1][i2]<<" ";
}
cout<<sum[i1][8]<<endl;
}
}
if(i!=k-1)
cout<<endl;
}
return 0;
}
-------------------------------------------------
错误历程:
1.原打算修改uva167找皇后源代码,并传入xy,限制这一位置必定有皇后,后来发现a[][0]会紊乱...
不知道啥时候删掉没用的a[][0],并且难以限制什么时候跳出循环
2.最后发现题目看错了。。。行列看错,存的sum也不对,当时内心一片灰暗,突然发现把输入改了就对了(中心对称大法好hhhh)