题目大意:

N*M的棋盘上摆了一些棋子,在剩余位置上尽可能多的摆上炮,使所有炮不能互吃

 

dfs+回溯

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #define max(x,y) x>y?x:y;
 5 using namespace std;
 6 int a[30],b[30],visit[7][7],n,m,q,ans;
 7 void dfs(int x,int y,int cnt)//一行一行地搜索,直到找到最后一行时结束时记录最大值
 8 {
 9     if(x>=n){
10         ans=max(ans,cnt);
11         return;
12     }
13     if(y>=m){
14         dfs(x+1,0,cnt);
15         return;
16     }
17     if(visit[x][y]){
18         dfs(x,y+1,cnt);
19         return;
20     }
21     dfs(x,y+1,cnt);
22     int t,flag=0;
23     for(t=y-1;t>=0;t--)
24         if(visit[x][t]) break;
25     for(int i=t-1;i>=0;i--)
26     {
27         if(visit[x][i]==2) {flag=1;break;}
28         if(visit[x][i]) break;
29     }
30     if(flag)return;//判断这一列上是否存在炮互吃
31     for(t=x-1;t>=0;t--)
32         if(visit[t][y]) break;
33     for(int i=t-1;i>=0;i--){
34         if(visit[i][y]==2) {flag=1;break;}
35         if(visit[i][y]) break;
36     }
37     if(flag) return;//判断这一行上是否存在炮互吃
38     visit[x][y]=2;
39     dfs(x,y+1,cnt+1);
40     visit[x][y]=0;//回溯
41 }
42 int main()
43 {
44     while(scanf("%d%d%d",&n,&m,&q)!=EOF){
45         memset(visit,0,sizeof(visit));
46         for(int i=0;i<q;i++){
47             scanf("%d%d",&a[i],&b[i]);
48             visit[a[i]][b[i]]=1;
49         }
50         ans=0;
51         dfs(0,0,0);
52         printf("%d\n",ans);
53     }
54     return 0;
55 }

 

 posted on 2014-09-06 19:33  Love风吟  阅读(230)  评论(0编辑  收藏  举报