给你一个棋盘,最大是5*5的,问你最多可以放多少个炮,炮和炮之间不可以相互攻击,
这块只的是只能走一步,不存在两个炮中间三个棋子的情况..
dfs搜索:对每一个格子判断是否可以放(没有障碍),如果可以放分放与不放两种方案;
分别搜索一下即可。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int n,m; int ans; int map[11][11]; int q; void dfs(int x,int y,int k) { if(x>=m) { ans=max(ans,k); return ; } if(y>=n) { dfs(x+1,0,k); return ; } if(map[x][y]) { dfs(x,y+1,k); return ; }
dfs(x,y+1,k);//不放 int flag=1; int i,j,sum,l; sum=0; for(i=x-1;i>=0;i--) { if(map[i][y]) sum++; if(sum==2&&map[i][y]==2) { flag=0; break; } } sum=0; for(i=y-1;i>=0;i--) { if(map[x][i]) sum++; if(sum==2&&map[x][i]==2) { flag=0; break; } } if(!flag) return ; map[x][y]=2; dfs(x,y+1,k+1);//放 map[x][y]=0; } int main() { int i, j , k, l; while(cin>>m>>n>>q) { ans=0; memset(map,0,sizeof(map)); for(i=0;i<q;i++) { cin>>k>>l; map[k][l]=1; } dfs(0,0,0); cout<<ans<<endl; } }