数据结构-kuangbin带你飞系列-1-棋盘问题

题目链接:https://cn.vjudge.net/contest/65959#problem/A

题解+代码:

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int n,k;
char a[10][10];
int vis[10];//因为不同行,所以记录列
int count=0;//有多少条路径
int way=0;//way在这里表示选择放入棋子的个数
void dfs(int h)
{
    int i;
    if(way==k)//当所选棋子数等于给定数的时候
    {
        count++;
        return ;
    }
    if(h>=n)//不能大于棋盘
        return ;
    for(i=0;i<=n-1;i++)
    {
        if(!vis[i]&&a[h][i]=='#')
        {
            vis[i]=1;
            way++;
            dfs(h+1);//i控制列数,改变h,使数据继续往下搜索
            vis[i]=0;//还原  假如第0行有两个#  当从第0行的第一个#开始往下走时,假设第2行中有且只有一个#,并且不与第一行中的任意一个在同一列,那么在往下
            way--; //走时就会把这个#标记
        }
    }
    dfs(h+1);//这里问的是棋盘所能摆放的数目,可以不从0开始,只要满足k=way即可
}
int main()
{
    int i;
    while(scanf("%d %d",&n,&k)!=EOF)
    {
        count=0;
        way=0;
        memset(vis,0,sizeof(vis));
        if(n==-1&&k==-1)
            break;
        for(i=0;i<=n-1;i++)
        {
            scanf("%s",a[i]);
        }
        dfs(0);
        printf("%d\n",count);
    }
    return 0;
}

 

猜你喜欢

转载自blog.csdn.net/weixin_44067773/article/details/88218672
今日推荐