acm pku 1321解题报告 棋盘问题

来源:互联网 发布:js div title属性 编辑:程序博客网 时间:2024/05/22 11:31
    做这个题目时一次性AC了,心里确实是挺高兴的。题目是这样的,给出一个
n*n的区域,棋盘在这个区域里面,用"."表示空白区,用“#”表示棋盘区,然后给出你棋子的个数,要你把这些棋子都放到棋盘上去,并且任意两个棋子都不能在同一行或者同一列。所求的是摆放棋子的方法的总数。
测试数据如下:

Sample Input

2 1
#.
.#
4 4
...#
..#.
.#..
#...
-1 -1

Sample Output

2
1

对于这样的题目我们可以用搜索的方法,把每一种可行的方法都搜索出来,然后
记录方法的总数。先从棋盘的第一个位置开始(假如在第一行,第一列),那么第
二颗棋子必然不在第一行,也不在第一列。对于第二颗棋子,我们也可以执行
和第一颗棋子一样同样的操作。显然这是一个递归的过程,当所有的棋子都放
完之后,再对方法总数加1。再从棋盘的第二个位置开始搜索.....
搜索过程如下:
void dfs(int x,int y,int num)
{
if(num == 0)
{
sum++;
return ;
}
visit[y] = true;
for(int i=x+1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
if(Mar[i][j] == '#' && !visit[j])
dfs(i,j,num-1);
}
}
visit[y] = false;
}
源代码下载:http://download.csdn.net/source/703657
原创粉丝点击