1321 棋盘问题 题解

 

 

 

 题解:dfs搜索

代码:

#include <iostream>
#include <cstring>
using namespace  std;
char mp[10][10];//存#和.
int  vis[10];//做标记,走过1,没走过0
int k,sum,n;
int dfs(int x,int cnt)//x表示的是当前行,cnt是放的棋子数
{
    if(cnt==k)
    {
        sum++;//放的棋子数正好等于所有的棋子数,正好都放完,方案加1
    }
    for(int i=x;i<n;i++)//继续往下搜
    {
        for(int j=0;j<n;j++)
        {
            if(vis[j]==0&&mp[i][j]=='#')//没走过
            {
                vis[j]=1;//标记已经走过
                dfs(i+1,cnt+1);//行数加一,棋子数加一
                vis[j]=0;//恢复原来的样子,因为要走第二次,看有没有其他的情况
            }
        }
    }
}
int main ()
{
    while (cin>>n>>k&&n!=-1&&k!=-1)
    {
        memset(vis,0,sizeof(vis));//把所有的地方都标记成0。
        sum=0;//计算个数
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                cin>>mp[i][j];
            }
        }
        dfs(0,0);//从第0行搜,用的棋子数是0.
        cout<<sum<<endl;
    }
    return 0;
}

 

posted @ 2020-05-20 22:13  心不懈  阅读(154)  评论(0)    收藏  举报