poj 1321 棋盘问题(DFS)

版权声明:本文为博主原创文章,转载请大喊一声“喵”。 https://blog.csdn.net/u013508213/article/details/20734679

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


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

直接看代码:

#include<stdio.h>
#include<string.h>

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<n时,row在等于n之前就可能已经把全部棋子放好
                      //又由于当全部棋子都放好后的某个棋盘状态已经在前面循环时记录了
                      //因此为了处理多余行,令当前位置先不放棋子,搜索在下一行放棋子的情况
    return;
}

int main()
{
    while(scanf("%d%d",&n,&k)!=EOF)
    {
        if(n==-1&&k==-1)
            break;
        memset(chess,0,sizeof(chess));
        memset(vis_col,0,sizeof(vis_col));

        getchar();//吸收回车
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=n; j++)
            {
                char tmp;
                scanf("%c",&tmp);
                if(tmp=='#')
                    chess[i][j]=1;
            }
            getchar();//吸收回车
        }

        ans=0;
        dfs(1,0);
        printf("%d\n",ans);
    }

    return 0;
}


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

展开阅读全文

没有更多推荐了,返回首页