69,394
社区成员
发帖
与我相关
我的任务
分享
递归就是dfs,非递归就是栈模拟一下dfs。
//八皇后问题
#include <stdio.h>
#include <math.h>
int count = 0;
void empress(int *position)
{
int i, j, flag;
while(position[8] != 1)
{
++position[0];
for(i = 0; i < 8; ++i)
{
if(position[i] == 8)
{
position[i] = 0;
++position[i+1];
}
}
flag = 1;
//判断结果是否满足条件
for(i = 0; i < 8; ++i)
{
for(j = 0; j < 8; ++j)
{
if(i != j)
{
if(position[i] == position[j])
flag = 0;
else if(abs(position[i] - position[j]) == abs(i-j))
flag = 0;
}
}
}
if(flag == 1)
{
//输出#代表皇后
for(i = 0; i < 8; ++i)
{
for(j = 0; j < 8; ++j)
{
if(position[i] == j)
printf("# ");
else
printf("0 ");
}
printf("\n");
}
printf("\n");
}
count += flag;
}
}
int main()
{
int position[9] = {0};
empress(position);
printf("%d种解\n", count);
return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define swap(a, b) temp = a; a = b; b = temp;
#define pop(i) swap(pos[i], pos[top]); top--;
#define push(i) top++; swap(pos[i], pos[top]);
int pos[8] = {7, 0, 1, 2, 3, 4, 5, 6};
int top = 7;
int temp;
void queen(int n)
{
int i;
char row[] = " ";
if(n == 1)
{
for(i = 0; i < 8; i++)
{
printf("%d", pos[i]);
}
printf("\n");
for(i = 0; i < 8; i++)
{
memset(row, ' ', 8);
row[pos[i]] = '*';
printf("%s\n", row);
}
printf("\n");
}
else
{
for(i = 0; i < n; i++)
{
pop(i);
queen(n - 1);
push(i);
}
}
}
int main()
{
queen(8);
return 0;
}
代码输出与楼上相同。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
#define swap(a, b) temp = a; a = b; b = temp;
#define pop(i) swap(pos[i], pos[top]); top--;
#define push(i) top++; swap(pos[i], pos[top]);
int pos[8] = {7, 0, 1, 2, 3, 4, 5, 6};
int top = 7;
int temp;
char row[] = " ";
int a, b, c, d, e, f, g, h, i;
for(a = 0; a < 8; a++)
{
pop(a);
for(b = 0; b < 7; b++)
{
pop(b);
for(c = 0; c < 6; c++)
{
pop(c);
for(d = 0; d < 5; d++)
{
pop(d);
for(e = 0; e < 4; e++)
{
pop(e);
for(f = 0; f < 3; f++)
{
pop(f);
for(g = 0; g < 2; g++)
{
pop(g);
for(h = 0; h < 1; h++)
{
for(i = 0; i < 8; i++)
{
printf("%d", pos[i]);
}
printf("\n");
for(i = 0; i < 8; i++)
{
memset(row, ' ', 8);
row[pos[i]] = '*';
printf("%s\n", row);
}
printf("\n");
}
push(g);
}
push(f);
}
push(e);
}
push(d);
}
push(c);
}
push(b);
}
push(a);
}
return 0;
}
最前面的几行输出:
01234567
*
*
*
*
*
*
*
*
10234567
*
*
*
*
*
*
*
*
12034567
*
*
*
*
*
*
*
*
21034567
*
*
*
*
*
*
*
*
02134567
*
*
*
*
*
*
*
*