pku 1321 棋盘问题

#include <stdio.h>
#include <string.h>

char board[10][10];

int n,k,ans,chess;

bool r_used[10],c_used[10];

void dfs(int row)
{
    if(chess==k)
    {
        ans++;
        return ;
    }
    if(n-row < k-chess ) return ;
    for(int j=0; j<n; j++)
    {
        if( board[row][j]=='#' && !r_used[row] && !c_used[j] )
        {
            r_used[row]=c_used[j]=true;
            chess++;
            dfs(row+1);

            chess--;//chess是全局变量
            r_used[row]=c_used[j]=false;
        }
    }
    dfs(row+1);//搜索下一行
}

int main()
{
    while(scanf("%d %d",&n,&k) && n!=-1 && k!=-1)
    {
        int i;
        for(i=0; i<n; i++)
            scanf("%s",board[i]);
        // memset(r_used,false,sizeof(r_used));
        // memset(c_used,false,sizeof(c_used));
        ans=0;
        chess=0;
        dfs(0);
        printf("%d\n",ans);
    }
    return 0;
}

//************************************************************************************************

 

#include <iostream>

using namespace std;

#define N 9

bool board[N][N],visited[N][N];
int n,k,ans;

bool isvalid(int row,int col)
{
    for(int i=0; i<row; i++)
        if(visited[i][col]) return false;
    return true;
}

void dfs(int row,int chess)
{
    if(chess==k)
    {
        ans++;
        return ;
    }
    if( row>=n ) return ;
    for(int j=0; j<n; j++)
    {
        if( !visited[row][j] && board[row][j] && isvalid(row,j) )
        {
            visited[row][j]=true;
            dfs(row+1,chess+1);
            visited[row][j]=false;
        }
    }
    dfs(row+1,chess);
}

int main()
{
    while(scanf("%d %d",&n,&k) && n!=-1 && k!=-1)
    {
        getchar();
        memset(board,false,sizeof(board));
        int i,j;
        char ch;
        for(i=0; i<n; i++)
        {
            for(j=0; j<n; j++)
            {
                scanf("%c",&ch);
                if(ch=='#')
                    board[i][j]=true;
            }
            getchar();
        }
        ans=0;
        dfs(0,0);
        printf("%d\n",ans);
    }
    return 0;
}

 

posted @ 2010-08-18 13:48  菜到不得鸟  阅读(151)  评论(0)    收藏  举报