poj 1321 棋盘问题(DFS)

大概题意就是给你一个棋盘,让你放棋子,求在棋盘n*n上的‘#’放上k个棋子的所有情况的数目。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列。


深搜可以搜索出所有答案。

直接看代码:

#include
#include

bool chess[9][9];
bool vis_col[9];
int n,k,ans;

void dfs(int row,int num) //当前搜索到row,num为已经放下的棋子
{
    if(num==k)
    {
        ans++;
        return ;
    }
    if(row>n)    //配合下面dfs(row+1,num); 语句使用,避免搜索越界
        return ;

    for(int j=1; j<=n; j++)
        if(chess[row][j] && !vis_col[j])
        {
            vis_col[j]=1;
            dfs(row+1,num+1);
            vis_col[j]=0;
        }

    dfs(row+1,num);   //这里是难点,当k


能力不够,陷入浮躁做题的死循环里,参考了网上大神们的代码,憋出一题,这样做能进步吗。。。???

你可能感兴趣的:(搜索)