自己写了一个二维棋盘的八皇后问题解法--递归思路。感觉没有直接一维数组,将数组分量索引当行数,值为列数那样简单。
#include<stdio.h>
#include<stdlib.h>
int judgement(int qipan[8][8],int row,int col){
int judge=0;
if(col==8)
return 1;
qipan[row][col]=1;//试着在一开始放一个棋子(1)
//开始判断在这之前有没有不符合条件的(2)
for (int i = 0; i < row; i++)//要遍历的行数()
{
for (int j = 0; j < 8; j++)
{
if (qipan[i][j]==1)
{
if (j==col || (i-row)==(j-col) ||(i-row)==(col-j))
{
judge=1;
break;
}
}
}
}
if (judge==1){
qipan[row][col]=0;
}else
qipan[row][col]=1;
return judge;
}
void Recurrect(int qipan[8][8] ,int *row, int *col){
if ((*row)==0 && (*col)==8)
{
return;
}
//判断这个位置是否是正确的,如果不正确
int judge=judgement(qipan,*row,*col);//可以将位置变成1
if (judge)
{
while((*col)<=7){
if(judgement(qipan,*row,*col)){//如果要回溯的话,一定要把本行的1变为零
(*col)++;
}else
break;
}
if((*col)==8){
for(int i=0; i<8; i++){//将本行的清空再去上一个
qipan[*row][i]=0;
}
(*row)--;
for((*col)=0;(*col)<8;(*col)++){//判断上一个col的位置
if(qipan[*row][*col]==1){
qipan[*row][*col]=0;
(*col)++;
break;
}
}
//判断下一个正确的位置
Recurrect(qipan,row,col);
}
}
}
void bahuanghou(){
int n=0;
int row=0;
int col=0;
int qipan[8][8]={0};//c语言中,数组初始化只能用int常量
while (1)
{
//printf("%d\n",row);
// printf("%d\n",col);
Recurrect(qipan,&row,&col);
if(row==0 && col==8){
printf("\n%d",n);
break;
}
// printf("%d\n",row);
// printf("%d\n",col);
//judge==0的时候
if (row==7)
{
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
printf(" %d",qipan[i][j]);
}
}
printf("\n");
col++;
}
else{
row++;
col=0;
};
}
}
int main(){
bahuanghou();
system("pause");
return 0;
}