//在一个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暴搜
最新推荐文章于 2021-10-21 18:26:48 发布