POJ 1321 棋盘问题 ( 深搜)

汉语题意,题目类似八皇后问题,深搜即可。。。貌似可以用状态压缩过,有空再研究研究。。 

// 172K	63MS
#include <cstdio>
#include <cstring>
#include <iostream>
#define N 9

using namespace std ;

bool graph[N][N] ;
bool flag[N][N] ;
bool column[N] ;
int ans ;

void
Init_Graph ( int const n )  //建图
{
    ans = 0 ;                       //初始化ans , flag数组,column数组
    memset ( flag , 0 , sizeof ( flag ) ) ;
    memset ( column , 0 , sizeof ( column ) ) ;
    for ( int i = 1 ; i <= n ; i ++ )
    {
        for ( int j = 1 ; j <= n ; j ++ )
        {
            char ch ;
            ch = getchar ( ) ;
            if ( '#' == ch )
            {
                graph[i][j] = true ;
            }
            else if ( '.' == ch )
            {
                graph[i][j] = false ;

            }
        }
        getchar ( ) ;       //吃掉回车
    }
}

void
DFS ( int const now_row , int const row , int const num , int const sum ) // num 代表当前已放棋子数,sum 代表总棋子数
{
    if ( num == sum )
    {
        ans ++ ;
        return ;
    }
    else if ( now_row > row )
    {
        return ;
    }
    else
    {

        for ( int j = 1 ; j <= row ; j ++ )   // 遍历列
        {
            if ( graph[now_row][j] && !flag[now_row][j] && !column[j] )
            {
                column[j] = true ;
                flag[now_row][j] = true ;
                DFS ( now_row + 1 , row , num + 1 , sum ) ;
                flag[now_row][j] = false ;
                column[j] = false ;
            }
        }
        DFS ( now_row + 1 , row , num , sum ) ;     //注意这个状态

    }
}

int
main ( )
{
    int n , k ;
    while ( EOF != scanf ("%d%d" , & n , & k ) )
    {
        if ( -1 == n && -1 == k )
        {
            break ;
        }
        getchar ( ) ; //吃掉第一个回车
        Init_Graph ( n ) ;
        DFS ( 1 ,  n , 0 , k ) ;
        printf ("%d\n" , ans ) ;
    }
    return 0 ;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值