(简单) POJ 1321 棋盘问题,回溯。

  Description

  在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。
 
  标准的回溯的问题,直接按行递归,就像八皇后的递归。
 
代码如下:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>

using namespace std;

int n,k;
int map1[10][10];
int remi[10],remj[10];
int ans;
int cou;

bool judge(int x,int y)
{
    for(int i=0;i<cou;++i)
        if(remj[i]==y)
            return 0;

    return 1;
}

void dfs(int cur,int hang)
{
    if(cur==k)
    {
        ++ans;
        return;
    }

    for(int i=hang;i<=n;++i)
    {
        if(n-i+1<k-cur)
            break;

        for(int j=1;j<=n;++j)
            if(map1[i][j]&&judge(i,j))
            {
                remi[cou]=i;
                remj[cou++]=j;
                dfs(cur+1,i+1);
                --cou;
            }
    }
}

int main()
{
    char c,s[20];
    
    ios::sync_with_stdio(false);

    for(cin>>n>>k;n!=-1&&k!=-1;cin>>n>>k)
    {
        ans=0;
        cou=0;
        for(int i=1;i<=n;++i)
        {
            cin>>s;

            for(int j=1;j<=n;++j)
            {
                c=s[j-1];
                if(c=='#')
                    map1[i][j]=1;
                else
                    map1[i][j]=0;
            }
        }

        dfs(0,1);

        cout<<ans<<endl;
    }

    return 0;
}
View Code
原文地址:https://www.cnblogs.com/whywhy/p/4228055.html