该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
看一下这个八皇后的回溯解法,基本原理差不多
#include
#define OUTPUT //是否输出解
#define N 8
int count;
int queen[N], column[N], left[N*2-1], right[N*2-1];
void F()
{
    int i = 0, j = N;
    while (1)
    {
        if (j == 0)
        {
            if (--i
                break;
            j = queen[i];
            column[j] = left[i+j] = right[N-1-j+i] = 0;
            continue;
        }
        while (j > 0)
        {
            --j;
            if (column[j]==0 && left[i+j]==0 && right[N-1-j+i]==0)
            {
                queen[i] = j;
                column[j] = left[i+j] = right[N-1-j+i] = 1;
                if (++i != N)
                    j = N;
                else
                {
                    ++count;
#ifdef OUTPUT
                    printf("%d:", count);
                    for (int m = N; m > 0; )
                        printf(" %d", queen[--m]);
                    putchar('\n');
#endif
                    --i;
                    column[j] = left[i+j] = right[N-1-j+i] = 0;
                }
                break;
            }
        }
    }
}
int main()
{
    F();
    printf("N=%d,%d 组解\n", N, count);
    return 0;
}