分析: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; }
时间: 2024-11-03 21:58:54