zoukankan      html  css  js  c++  java
  • (简单) 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
  • 相关阅读:
    Eclipse
    svn 常用
    spidermonkey编译
    float format 显示
    点击6次修改服务器地址
    UITextField字数限制
    UINavigationController
    运行时runtime
    IOS 技术与面试
    Cocos2dx笔记
  • 原文地址:https://www.cnblogs.com/whywhy/p/4228055.html
Copyright © 2011-2022 走看看