易语言二维数组棋盘_棋盘问题

323:棋盘问题

描述

在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。

输入

输入含有多组测试数据。
每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n
当为-1 -1时表示输入结束。
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。

输出

对于每一组数据,给出一行输出,输出摆放的方案数目C (数据保证C<2^31)。

样例输入

2 1

#.

.#

4 4

...#

..#.

.#..

#...

-1 -1

样例输出

2

1

一.题意分析

这是一道关于搜索的题目,输入棋盘大小,棋子数量,棋盘布局,即可得所求解。

二.算法说明

#include <stdio.h>

#include <string.h>

char b[8][9];

int count,n,occupied[8]={};//记录列的占用情况

void DFS(int k,int a)

{

if(k == 0)//找到了一种解

{

count++;

return;

}

int i,j;

for(i=a;i<n;i++)

for(j=0;j<n;j++)

if(b[i][j]=='#'&&occupied[j]!=1)//找到了一个合适的位置

{

occupied[j]=1;

if(i!= n-1)

DFS(k-1,i+1);

else if(k==1)

count++;

occupied[j]=0; //修改标记后,递归回来后要及时复原

}

}

int main()

{

int k,i;

scanf("%d%d",&n,&k);

while(n+1)

{

for(i=0;i<n;i++)

scanf("%s",b[i]);

count=0;

DFS(k,0);

printf("%dn",count);

scanf("%d%d",&n,&k);

}

return 0;

}

1c6d56a5910706d27c5f8b2d87130fb6.png

这题需要用到深度搜索,每次从上一个放棋子地方的下一行开始寻找可以放棋子的地方,当发现该点时,记录行数,并更新棋盘,将于此点同行同列的都更新为‘0’,如果找不到,则返回,当把所有棋子都放上去的时候,则找到一个解,计数+1,就这样进行搜索。

三.数据结构

一维数组和二维数组。

四.算法分析

本题适用于深度搜索,若使用广度优先的搜索方法,有可能会出现超时的情况。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值