pku 1321 深搜 棋盘问题 解题报告

一、题目:棋盘问题。

二、题意:http://acm.pku.edu.cn/JudgeOnline/problem?id=1321

三、解决方法:

      深度优先搜索。

四、源代码:

#include "string.h"
#include "stdlib.h"

#define MAX 9
int n, m;
int c;
char Chessboard[MAX][MAX];
int visit[MAX];

void dfs(int a, int k)
{
 int i;
 
 if (k == m)   //k个棋子
    {
  c++;
        return;
    }
    if (a > n)    //在棋盘的范围内,不能找到相应的解决办法
    {  
        return;
    }
    for (i = 1; i <= n; i++)
    {  
  if (!visit[i] && Chessboard[a][i] == '#')
        {  
   visit[i] = 1;
            dfs(a + 1, k + 1); //发现'#',将所在同一行与同一竖记录
            visit[i] = 0;      //一边搜索一边将记号归0,以便下一次搜索与这次的深度优先搜索
        }
    }
    dfs(a + 1, k);             //如果在一行中n个棋子都为'.'的情况
}

int main()
{  
 freopen("1.txt", "r", stdin);
    int i, j;
 
 while (scanf("%d%d", &n, &m))
    {  
  getchar();
  if (n == -1 && m == -1)
  {
   break;
  }
  for (i = 1; i <= n; i++)
  {  
   for (j = 1; j <= n; j++)
   {  
    scanf("%c",&Chessboard[i][j]);
   }
   getchar();
  }
  memset(visit, 0, sizeof(visit));
        c = 0;
        dfs(1, 0);
  printf("%d/n",c);
    }

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值