问题如下:
国际象棋的棋盘可以看做是一个 8 × 8 的矩阵,上面每一个格子仅能放一枚棋子,现在给出一个 8 × 8 的由 0 和 1 组成的矩阵,代表象棋棋盘,1 代表当前位置放置了一个皇后,0 则代表什么都没有放,上面有 n(n 为小于 8 的正整数)个位置已经放上了皇后棋子(相互之间不冲突,合理摆放),现在另外给你 8 - n 个皇后,问你有多少合理的摆法。
输入描述:
一个 8 × 8 的由 0 和 1 组成的矩阵。
输出描述:
一个整数,为摆放的种类数。
样例输入:
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
样例输出:
4
我的代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
int board[8][8]={0};
int b[8]={0};
int p[8]={0};
int total=0;
int count1=0;
int count2=0;
int c=0;
int k=0;
bool set(int i,int j){//测试(i,j)是否可放皇后
if(b[i]!=0)
return false;//i行已有皇后,不可再放
for(int k=0;k<8;k++){
if(b[k]!=0&&(b[k]==j||abs(b[k]-j)==abs(i-k)))
return false;
}
return true;
}
void queen(int c){
if(c==k){
total++;
}
else
for(int j=0;j<8;j++){
if(set(p[c],j)){
b[p[c]]=j;
queen(c+1);
b[p[c]]=0;
}
}
}
int main(){
int i,j;
total=0;
for(i=0;i<8;i++){
int f=1;
for(j=0;j<8;j++){
scanf("%d",&board[i][j]);
if(board[i][j]==1){
b[i]=j;
count1++;
f=0;
}
}
if(f) p[k++]=i;
}
queen(0);
printf("%d",total);
return 0;
}
我的想法是将空行以p[]表示出来,然后用queen()递推,但是答案总是会打好多,手头模拟也没找出来哪里有问题,请问哪里有问题,啦
#include<bits/stdc++.h>
using namespace std;
int a[1000],b[1000],c[1000],d[1000];//行 列 左下到右上 左上到右下
int ans;
int m[100][100];
void dfs(int i)
{
if(i==8+1){
ans++;
return;
}
if(a[i]){
dfs(i+1);
return;
}
for(int j=1;j<=8;j++)
if((!b[j])&&(!c[i+j])&&(!d[i-j+8])){
a[i]=j;
b[j]=1;
c[i+j]=1;
d[i-j+8]=1;
dfs(i+1);
a[i]=0;
b[j]=0;
c[i+j]=0;
d[i-j+8]=0;
}
}
int main()
{
for(int i=1;i<=8;i++)
for(int j=1;j<=8;j++){
cin>>m[i][j];
if(m[i][j]==1){
a[i]=j;
b[j]=1;
c[i+j]=1;
d[i-j+8]=1;
}
}
dfs(1);
cout<<ans<<endl;
return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!手动观察变量时候发现了是初始化为0与第0列的冲突问题导致了错误,
贴上修改后正确代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
int board[9][9]={0};
int b[9]={0};
int p[9]={0};
int total=0;
int count1=0;
int count2=0;
int c=1;
int k=1;
bool set(int i,int j){//测试(i,j)是否可放皇后
if(b[i]!=0)
return false;//i行已有皇后,不可再放
for(int k=1;k<=8;k++){
if(b[k]!=0&&(b[k]==j||abs(b[k]-j)==abs(i-k)))
return false;
}
return true;
}
void queen(int c){
if(c==k){
total++;
}
else{
int cur=p[c];
for(int j=1;j<=8;j++){
if(set(cur,j)){
b[cur]=j;
queen(c+1);
b[cur]=0;
}
}
}
}
int main(){
int i,j;
total=0;
for(i=1;i<=8;i++){
int f=1;
for(j=1;j<=8;j++){
scanf("%d",&board[i][j]);
if(board[i][j]==1){
b[i]=j;
count1++;
f=0;
}
}
if(f) p[k++]=i;
}
queen(1);
printf("%d",total);
return 0;
}