📄 cpp1.cpp
字号:
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
int *x;
int n,m,sum=0;
int Place(int);
void QueenGet(void);
void TraceBack(int);
void PrintMethod(void);
void main(void)
{
printf("Input Queen n: ");
scanf("%d",&n);
printf("Input chessboard m: ");
scanf("%d",&m);
x=(int *)malloc(sizeof(int)*m);
printf("\"Q\" means Queen position. \n\"*\" means no chessman.");
QueenGet();
getchar();
getchar();
}
int Place(int r)//检测第r行放的位置是否可行
{
int i;
for(i=0;i<r;i++){
int tempxr=x[r],tempxi=x[i],tempri=r-i,tempx=x[r]-x[i];
if(x[r]==x[i] || abs(r-i)==abs(x[r]-x[i]))
{
int tempxr=x[r],tempxi=x[i],tempri=r-i,tempx=x[r]-x[i];
return 0;
}
}
int tempxr=x[r],tempxi=x[i],tempri=r-i,tempx=x[r]-x[i];
return 1;
}
void TraceBack(int r,int ex, int queen)//安置第r行的棋子
{
int i,j,ex_c=ex;
if(r>=n && queen==n) //如果r等于n则表示n个皇后都布置好
{
sum++;
PrintMethod();//输出n个皇后
}else
{
for(j=0;j<=ex_c;j++)
{
ex=ex-j;
for(i=0;i<m;i++)//从第r行开始
{
x[r]=i;//第r行位置为i
//如果可以放,那么就进行下一行,不可行就让第r行向后挪1位
if(Place(r))
{
TraceBack(r+1,ex,queen+1);
}
}
x[r]=100;
r=r+1;
int temp=j;
}
}
}
void PrintMethod(void)
{
int i,j;
printf("\nmethod %d\n",sum);
for(i=0;i<m;i++){
for(j=0;j<m;j++){
if(j==x[i]) printf("Q ");
else printf("* ");
}
printf("\n");
}
}
void QueenGet(void)
{
int queen=0,ex=m-n;
TraceBack(0,ex,queen);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -