标签:style blog color os io for div sp log
题目大意:
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 }
标签:style blog color os io for div sp log
原文地址:http://www.cnblogs.com/CSU3901130321/p/3959716.html