POJ_1321 棋盘问题(深搜)

来源:互联网 发布:淘宝店铺一键复制软件 编辑:程序博客网 时间:2024/05/23 01:19

题目来源:点击打开链接

题目大意:给一个一定形状的棋盘,其大小为N*N,‘#’代表可放棋子,‘.’代表不可放棋子。共k个棋子,问一共有多少摆放方法?

这是一道简单的深搜问题,直接上代码了。

/********************************************深度优先搜索***********************************************/#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<string>#include<algorithm>#include<stack>#include<queue>#include<map>using namespace std;const int maxn = 8+2;//定义最大棋盘int n;//记录棋盘真正大小int k;//记录棋子个数char mymap[maxn][maxn];//定义我的棋盘,记录形状int col[maxn];//记录某一列有没有被放入棋子int ans;//记录结果//mybegin代表当前所处的行 mylength代表还有多少个棋子未被放入void dfs( int mybegin, int mylength){    for( int i = 0; i < n; i++)    {        //当前列没有被放入棋子并且可以被放入棋子        if( col[i] == 0 && mymap[mybegin][i] == '#')        {            //如果只剩下一个棋子未被放入 则将它放入到mymap[mybegin][i]这个点 ans++            if( mylength == 1)                ans++;            else            {                col[i] = 1;//将当当前棋子放入到该点(mymap[mybegin][i])                //继续往下搜索                for( int j = mybegin+1; j <= n-mylength+1; j++)//n-mybegin+1 = n-(mylength-1);                    dfs(j,mylength-1);//减少了一个棋子                col[i] = 0;            }        }    }}int main(){    while( scanf("%d%d",&n,&k) == 2 && n != -1 && k != -1)    {        memset(col,0,sizeof(col));//初始化列标记为0,表示每一列都没有放入棋子        ans = 0;//初始化棋子        for( int i = 0; i < n; i++)            scanf("%s",mymap[i]);        for( int i = 0; i <= n-k; i++)//从第0行搜索到第n-k行,自己可以画图理解为什么这样            dfs(i,k);        printf("%d\n",ans);    }    return 0;}



0 0
原创粉丝点击