【题意】给了棋盘上一些兵位置,最大5*5,现在要求你放一些炮到这个棋盘上,使得这些炮之间不能互相攻击!

【分析】水dfs,比8皇后还要简单,简单回溯即可!

【AC代码】

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int n,m,q,x,y,sum;
int chess[6][6];
void dfs(int x,int y,int cnt)
{
    if(x==n)
    {
        sum = max(sum,cnt);
        return ;
    }
    if(y==m)
    {
        dfs(x+1,0,cnt);
        return ;
    }
    if(chess[x][y])
    {
        dfs(x,y+1,cnt);
        return ;
    }
    dfs(x,y+1,cnt);
    bool *** = true;
    int i,j;
    for(i=x-1; i>=0; i--)
    {
        if(chess[i][y]) break;
    }
    for(j=i-1; j>=0; j--)
    {
       if(chess[j][y])
       {
           if(chess[j][y]==2)
           {
               *** = false;
           }
           break;
       }
    }
    if(***==false) return;
    for(i=y-1; i>=0; i--)
    {
        if(chess[x][i])break;
    }
    for(int j=i-1; j>=0; j--)
    {
        if(chess[x][j])
        {
            if(chess[x][j]==2)
            {
                *** = false;
            }
            break;
        }
    }
    if(***==false) return ;
    chess[x][y] = 2;
    dfs(x,y+1,cnt+1);
    chess[x][y] = 0;
}
int main()
{
    while(~scanf("%d%d%d",&n,&m,&q))
    {
        sum = 0;
        memset(chess,0,sizeof(chess));
        while(q--)
        {
            scanf("%d%d",&x,&y);
            chess[x][y] = 1;
        }
        dfs(0,0,0);
        printf("%d\n",sum);
    }
    return 0;
}