死磕八皇后,与递归比,这样也不慢吧?请高手评价。
我只学了两个月,自己乱想的算法。/*************************************************
2014年3月28日 19:13:41
八皇后算法:
1:用二维数组模拟8*8的棋盘;
2:按照8皇后要求得出结论:没有任何两个皇后在同
一列,同一行。因此它们的坐标ar[行][列]不会有任何相同的数;
3:用8个for穷尽8个皇后的坐标分布;
4:按第二条规则排除同行或同列的结果;
5:调用ff函数排除在同一斜线上的皇后的结果;
6:剩下的就是最终结果。
*************************************************/
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
/*
ff用于排除每行位置上的皇后斜线相交。
*/
int ff(int (*p)[8], int a, int b, int c, int d, int e, int f, int g, int h)
{
int i=0, j=0, k = 0, z = 0;
int line[8] = {0, 1, 2, 3, 4, 5, 6, 7};
int rank[8] = {a, b, c, d, e, f, g, h};
for (z=0; z<8; ++z)
{
for(i=line[z]+1, j=rank[z]+1; (i<8) && (j<8); ++i, ++j) //i 和 j必须同时变化。
{
if (1 == *(*(p+i)+j))
{
k=1;
break;
}
}
}
for (z=0; z<8; ++z)
{
for(i=line[z]-1, j=rank[z]-1; (i>=0) && (j>=0); --i, --j)
{
if (1 == *(*(p+i)+j))
{
k=1;
break;
}
}
}
for (z=0; z<8; ++z)
{
for(i=line[z]+1, j=rank[z]-1; (i<8) && (j>=0); ++i, --j)
{
if (1 == *(*(p+i)+j))
{
k=1;
break;
}
}
}
for (z=0; z<8; ++z)
{
for(i=line[z]-1, j=rank[z]+1; (i>=0) && (j<8); --i, ++j)
{
if (1 == *(*(p+i)+j))
{
k=1;
break;
}
}
}
return k;
}
int pp (int *a,int *b,int *c,int *d,int *e,int *f,int *g,int *h)
{
int i=1;
int n, m, t=0;
int ar[8] = {*a, *b, *c, *d, *e, *f, *g, *h};
for (n=0; n<8-1; ++n)
{
for (m=0; m<8-1-n; ++m)
{
if (ar[m] > ar[m+1])
{
t = ar[m];
ar[m] = ar[m+1];
ar[m+1] = t;
}
}
}
m=0;
for (n=0; n<8; ++n)
{
if(ar[n+1] == ar[n])
{
m=1;
break;
}
}
if (0 == m)
i=0;
return i;
}
int main(void)
{
int a=0, b=0, c=0, d=0, e=0, f=0, g=0, h=0, n=0, m=0, i, j, w, t=0; //行是已知道的,把列分别标号a,b,c....h。用以确定每个数的坐标。
int ar[8][8] = {0};
int arr[8] = {0};
for (a=0; a<8; ++a)
{
for (b=0; b<8; ++b)
{
if ((a==b)||((a-1)==b)||((a+1)==b))
continue;
for (c=0; c<8; ++c)
{
if ((b==c)||((b-1)==c)||((b+1)==c))
continue;
for (d=0; d<8; ++d)
{
if ((c==d)||((c-1)==d)||((c+1)==d))
continue;
for (e=0; e<8; ++e)
{
if ((d==e)||((d-1)==e)||((d+1)==e))
continue;
for (f=0; f<8; ++f)
{
if ((e==f)||((e-1)==f)||((e+1)==f))
continue;
for (g=0; g<8; ++g)
{
if ((f==g)||((f-1)==g)||((f+1)==g))
continue;
for (h=0; h<8; ++h)
{
if ((g==h)||((g-1)==h)||((g+1)==h))
continue;
if (0 == pp(&a, &b, &c, &d, &e, &f, &g, &h))
{
ar[0][a]=1;
ar[1][b]=1;
ar[2][c]=1;
ar[3][d]=1;
ar[4][e]=1;
ar[5][f]=1;
ar[6][g]=1;
ar[7][h]=1;
if (0 == ff(ar, a, b, c, d, e, f, g, h))
{
for (i=0; i<8; ++i)
{
for (j=0; j<8; ++j)
{
printf("%6d", ar[i][j]);
if (7==j)
printf("\n\n");
}
}
++t;
printf("t = %d\n", t);
printf("\n\n");
//system("pause");
}
memset(ar, 0, sizeof(ar)); //清除上一次放到ar[][]内的数据,好重新下次循环
}
}
}
}
}
}
}
}
}
return 0;
}