PKU1321——棋盘问题
2009-05-12 19:17 Logic0 阅读(305) 评论(0) 收藏 举报http://acm.pku.edu.cn/JudgeOnline/problem?id=1321
题目大致意思是:在给定的棋盘上放置K个棋子,不能同行同列,不能放置于棋盘空白位置,求有多少种放法。
深搜。棋盘上的一个点共有三种状态:未放棋子的棋盘点,放了棋子的棋盘点,空白点。分别用:等于0,大于0,小于0,三种状态表示即可。
基本思路:
注意剪枝即可。限制条件,不能同行同列,不能至于空白,一行内需要至少有一个0状态点。
CODE:
#include<iostream>
using namespace std;
int board[10][10];
int n,k,c;
void dfs(int num)
{
    if(num>k)
    {
        c++;
        return;
    }
    for(int u=num-1;u<n;u++)
    { 
        if(k-num>n-1-u) 
            return;
        for(int i=0;i<n;i++)
        {
   //同一行不允许存在两个棋子
            if(board[u][i]>0) 
                break;
            if(board[u][i]==0)
            {
                int j;
    //同一行不允许存在两个棋子
                for(j=i+1;j<n;j++) 
                    if(board[u][j]>0) 
                        break;
                if(j<n) 
                    break;
    //同一列不允许存在两个棋子
                for(j=0;j<u;j++) 
                    if(board[j][i]>0) 
                        break;
                if(j==u)
                {
                    board[u][i]=num;
                    dfs(num+1);
                    board[u][i]=0;
                }
            }
        }
    }
}
int main()
{
 //ifstream cin("input.txt");
    char str[10];
    while(1)
    {
        cin>>n>>k;
        if(n==-1 && k==-1) break;
        for(int i=0;i<n;i++)
        {
            cin>>str;
            for(int j=0;j<n;j++)
            {
                if(str[j]=='#') 
                    board[i][j]=0;
                else 
                    board[i][j]=-1;
            }
        }
        c=0;
        dfs(1);
        cout<<c<<endl;
    }
}
 
                    
                     
                    
                 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号