分析:N和M很小,直接暴力搜索即可。
#include<iostream>
using namespace std;
#define N 6
#define M 6
int vis[N][M]; //有炮设为2,无炮为0,其他为1
int n,m,q,ans;
#define max(a,b) ((a)>(b)?(a):(b))
bool Valid(int i,int j) //只需要判断当前和前面的即可(行列)
{
int fg=0;
int k;
if(vis[i][j]==1)
return false;
for(k=i-1;k>=0;k--) //行
if(vis[k][j]==1)
fg++;
else if(vis[k][j]==2)
{
if(fg==1)
return false;
else
fg++;
}
fg=0; //列
for(k=j-1;k>=0;k--)
if(vis[i][k]==1)
fg++;
else if(vis[i][k]==2)
{
if(fg==1)
return false;
else
fg++;
}
return true;
}
void DFS(int cnt,int x,int y)
{
int i,j;
for(i=x;i<n;i++)
for(j=0;j<m;j++)
{
if(i==x && j<y)
continue;
if(Valid(i,j))
{
vis[i][j]=2;
DFS(cnt+1,i,j+1);
vis[i][j]=0;
}
}
ans=max(ans,cnt);
}
int main()
{
int a,b,i;
ios::sync_with_stdio(false);
while(cin>>n>>m>>q)
{
ans=0;
memset(vis,0,sizeof(vis));
for(i=0;i<q;i++)
{
cin>>a>>b;
vis[a][b]=1;
}
DFS(0,0,0);
cout<<ans<<endl;
}
return 0;
}原文地址:http://blog.csdn.net/a809146548/article/details/46286495