回溯法--《算法入门经典》

n皇后问题

经典的n皇后问题的回溯解法
1、

void  nqueen(int cur,int n)
{
    if(cur == n)//输出解
    {
        tot++;//全局变量
        for(int i=0 ; ifor(int j=0 ; jif(C[i] == j)printf("Q");
                else printf("0");
            putchar('\n');
        }
        printf("-------------------\n");
    }else for(int i=0 ; iint ok =1;
        C[cur] = i;
        for(int j = 0 ; jif( C[cur] == C[j] || cur - C[cur] == j-C[j] || cur+C[cur] == j+C[j])//扫描在之前的行列及对角线是否已经出现
            {
                ok = 0;
            }
        }
        if(ok)nqueen(cur+1,n);//递归搜索下一个解
    }
}

2、

int vis[3][MAXN];//

void nqueen(int cur,int n)
{
    if(cur == n)
    {
        tot++;
        for(int i=0 ; ifor(int j=0 ; jif(C[i] == j)printf("Q");
                else printf("0");
            putchar('\n');
        }
        printf("-------------------\n");
    }else for(int i=0 ; iif(!vis[0][i] && !vis[1][cur+i] && !vis[2][cur-i+n])//储存好行列对角线已经有的皇后
        {
            C[cur] = i;
            vis[0][i] = vis[1][i+cur] = vis[2][cur-i+n] = 1;
            nqueen(cur+1,n);
            vis[0][i] = vis[1][i+cur] = vis[2][cur-i+n] = 0;//一定要改回来!
        }
    }
}

你可能感兴趣的:(算法理论)