POJ 1321 棋盘问题(DFS回溯)

POJ 1321 棋盘问题(DFS回溯)

http://poj.org/problem?id=1321

题意:

        要在n*n的不规则棋盘(棋盘上可能有不能放棋子的格子)上放k(k<=n)个棋子,且任意棋子不同行不同列,问有多少种方法.

分析:

        类似于8皇后问题,可以同样的dfs回溯构造.

        我们保证每行只放一个棋子即可(所以每个棋子肯定不同行)。但是所有棋子不用列。

        令cnt表示当前我们已经放了几个棋子了,且我们放棋子是从上往下放的(即从行号小的行放到行号大的行).这样我们就保证我们放棋子的时候行号不会重复.

        接下来用vis[c]来表示当前第c列是否已经有棋子放了.那么我们就可以使得棋子在列上也不重复.

AC代码:

#include
#include
using namespace std;
char map[10][10];
int n,k;
int ans;     //最终解
bool vis[10];//标记列
void dfs(int cnt,int row)//当前已经放了cnt个棋子,且我们这轮从第row行开始放(即我们上轮在row-1行放了棋子)
{
    if(cnt==k) ans++;
    else
    {
        for(int r=row;r<=n-(k-cnt);r++)//因为还有k-cnt个格子要放,所以从r到n-1至少要有k-cnt行
        for(int c=0;c


你可能感兴趣的:(practice,again,图论--DFS,★★,ACM--题解汇总)