70,023
社区成员




#include <stdio.h>
#define N 8
int sum = 0;
int nRowQ[N] = {0}, LeftTopRightDown[2*N - 1] = {0}, RightTopLeftDown[2*N - 1] = {0};
int nAns[N][2];
void SearchRow(int nLine)
{
int nRow = 0;
for (; nRow < N; nRow++)
{
if(0 == nRowQ[nRow] && 0 == LeftTopRightDown[nLine - nRow + N - 1] && 0 == RightTopLeftDown[nLine + nRow + N - 1])//如果左上右上都有空的话占用这个位置。
{
nRowQ[nRow] = 1;
LeftTopRightDown[nLine - nRow + N - 1] = 1;
RightTopLeftDown[nLine + nRow + N - 1] = 1;//1表示格子被占了。
nAns[nLine][0] = (nLine + 1);//记录下答案。
nAns[nLine][1] = (nRow + 1);
if ((N - 1) > nLine)
{
SearchRow(nLine + 1);//如果不是最后一个就查找下一列
nRowQ[nRow] = 0;//如果查找失败则需要清空前面的结果。
LeftTopRightDown[nLine - nRow + N - 1] = 0;
RightTopLeftDown[nLine + nRow + N - 1] = 0;
}
else
{
int i;
++sum;//总数+1
printf("%d\n", sum);
for (i = 0;i < N; i++)
{
printf("(%d,%d)", nAns[i][0], nAns[i][1]);
}
printf("\n");
nRowQ[nRow] = 0;
LeftTopRightDown[nLine - nRow + N - 1] = 0;
RightTopLeftDown[nLine + nRow + N - 1] = 0;//找到一组解应该清空
}
}
}
}
void Search()
{
int nLine = 0;
SearchRow(nLine);
return ;
}
int main()
{
Search();
printf("\n一共%d种", sum);
return 0;
}
#include<stdio.h>
int queen[8],b[8],c[15],d[15];
int sum=0;
void display()
{
int k;
printf("%d:",sum++);
for(k=0;k<8;k++)
printf(" %d",queen[k]);
printf("\n");
}
void ptry(int i)
{
int j; /*每个皇后都有8个可能位置*/
for(j=0;j<8;j++)
{
if(b[j]==0&&c[i+j]==0&&d[i-j+7]==0)/*判断位置是否冲突*/
{
queen[i]=j; /*摆放皇后*/
b[j]=1; /*宣布占领第j行*/
c[i+j]=1; /*占领两个对角线*/
d[i-j+7]=1;
if(i<7) __________________多了个';' /*8个皇后没有摆完,递归摆放下一个皇后*/
ptry(i+1);
else
display(); /*完成任务,打印结果*/
b[j]=0; /*回溯*/
c[i+j]=0;
d[i-j+7]=0;
}
}
}
void main()
{
int k;
for(k=0;k<8;k++)
{
b[k]=0;
c[k]=0;
d[k]=0;
}
ptry(0);
getch();
}