hdu4499Cannon dfs暴搜

//在一个n*m(n,m<=5)的棋盘上原来放着棋子
//在棋盘的空位上放炮,要求一个炮不能吃到
//另一个
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std ;
const int maxn = 10 ;
int map[maxn][maxn] ;
int n , m ;
int judge(int i , int j)
{
    int flag = 0 ;
    for(int k = i+1;k <= n;k++){
       if(map[k][j]==2&&flag==1){
            return false ;
        }
        if(map[k][j]){
            flag++ ;
        }
    }
    flag = 0;
    for(int k = i-1;k > 0;k--){
        if(map[k][j]==2&&flag==1){
            return false ;
        }
        if(map[k][j]){
            flag++ ;
        }
    }
    flag = 0 ;
    for(int k = j+1;k <= m;k++){
       if(map[i][k]==2&&flag==1){
           return false ;
       }
       if(map[i][k]){
          flag++;
       }
    }
    flag = 0 ;
    for(int k = j-1;k > 0;k--){
        if(map[i][k]==2&&flag==1){
            return false ;
        }
        if(map[i][k]){
            flag++;
        }
    }
    return true ;
}
int dfs(int x , int y ,int sum)
{
    y++ ;
    if(y == m+1){
       x++ ;
       y = 1 ;
    }
    if(x == n+1){
       return sum ;
    }
    int ans = 0 ;
    ans = dfs(x , y , sum) ;
    if(map[x][y] == 0){
        map[x][y] = 2 ;
        if(judge(x,y))
        ans = max(ans , dfs(x , y , sum+1)) ;
        map[x][y] = 0 ;
    }
    return ans ;
}
int main()
{
    int q ;
    while(~scanf("%d%d%d" , &n , &m , &q)){
        memset(map , 0 , sizeof(map)) ;
        for(int i = 1;i <= q;i++){
            int a , b ;
            scanf("%d%d" , &a , &b) ;
            map[a+1][b+1] = 1 ;
        }

        printf("%d\n" , dfs(1,0 , 0)) ;
    }
    return 0 ;
}

你可能感兴趣的:(hdu4499Cannon dfs暴搜)