69,371
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#define block(a,b,c) change(a,b,2,c)
#define unblock(xy) rechange(xy)
typedef struct
{
int i;
int j;
}XY;
void queen(int, int);
void change(int m, int n, int num, XY *p);
void rechange(XY *p);
int matrix[8][8] = { 0 };
int num = 0;
int main()
{
queen(8, 0);
return 0;
}
void queen(int n,int i)
{
if (n == 0)
{
num++;
printf("第%d种解法\n", num);
for (int i = 0; i < 7; i++)
{
for (int j = 0; j < 7; j++)
{
if (matrix[i][j] == 0 || matrix[i][j] == 2)
putchar(' ');
else
putchar('*');
}
putchar('\n');
}
return;
}
for (int j = 0; j != 8; j++)
{
if (matrix[i][j] == 0)
{
XY xy[13] = { 0 };
matrix[i][j] = 1;//在这里设置断点1
printf("%d\n%d\n", n, i);//n=8 i=0
block(i, j, xy);//执行完此语句n和i的值会变化????
//宏展开change(i,j,2,xy);
printf("%d\n%d\n", n, i);//n=6 i=7 问题出在这里,change函数是怎么改变n和i的值的?
queen(n - 1, i + 1);//在这里设置断点2
matrix[i][j] = 0;
unblock(xy);
}
}
}
void change(int m, int n, int num,XY *p)
{
int i, j;
//上
for (i = m - 1, j = n; i != -1; i--)
{
if (matrix[i][j] == 2)
break;
matrix[i][j] = num;
p->i = i;
p->j = j;
p++;
}
//下
for (i = m + 1, j = n; i != 8; i++)
{
if (matrix[i][j] == 2)
break;
matrix[i][j] = num;
p->i = i;
p->j = j;
p++;
}
//左
for (i = m, j = n - 1; j != -1; j--)
{
if (matrix[i][j] == 2)
break;
matrix[i][j] = num;
p->i = i;
p->j = j;
p++;
}
//右
for (i = m, j = n + 1; j != 8; j++)
{
if (matrix[i][j] == 2)
break;
matrix[i][j] = num;
p->i = i;
p->j = j;
p++;
}
//左上
for (i = m - 1, j = n - 1; i != -1 && j != -1; i--, j--)
{
if (matrix[i][j] == 2)
break;
matrix[i][j] = num;
p->i = i;
p->j = j;
p++;
}
//左下
for (i = m + 1, j = n - 1; i != 8 && j != -1; i++, j--)
{
if (matrix[i][j] == 2)
break;
matrix[i][j] = num;
p->i = i;
p->j = j;
p++;
}
//右上
for (i = m - 1, j = n + 1; i != -1 && j != 8; i--, j++)
{
if (matrix[i][j] == 2)
break;
matrix[i][j] = num;
p->i = i;
p->j = j;
p++;
}
//右下
for (i = m + 1, j = n + 1; i != 8 && j != 8; i++, j++)
{
if (matrix[i][j] == 2)
break;
matrix[i][j] = num;
p->i = i;
p->j = j;
p++;
}
p->i = -1;
p->j = -1;
}
void rechange(XY *p)
{
for (; p->i != -1; p++)
matrix[p->i][p->j] = 0;
}
#include <stdio.h>
int d[8][8];
int n;
void queen8(int L) {
int x,y;
if (8==L) {
n++;
printf("%d\n",n);
for (y=0;y<8;y++) {
for (x=0;x<8;x++) {
// printf("%d",d[y][x]);
if (d[y][x]) printf("■");
else printf("□");
}
printf("\n");
}
return;
}
for (x=0;x<8;x++) {
for (y=0;y<L;y++) {
if ( d[y][x ]
|| (x-(L-y)>=0 && d[y][x-(L-y)])
|| (x+(L-y)< 8 && d[y][x+(L-y)]))
break;
}
if (y>=L) {
d[L][x]=1;
queen8(L+1);
d[L][x]=0;
}
}
}
int main() {
int y,x;
for (y=0;y<8;y++) {
for (x=0;x<8;x++) {
d[y][x]=0;
}
}
queen8(0);
return 0;
}