标签:dfs
题意是给你5*5的棋盘 里面有棋子 问能在棋盘里最多放多少的炮(条件是炮之间不能互相攻击)
思路:棋盘很小 很容易想到dfs解决 先找出所有的空格(好像网上都没这样做的 个人习惯吧 不想用for循环去找) 然后依次放或不放炮 深搜到底 至于判断能不能攻击 直 接用for循环来判断 map用来标记有没有棋子 mark标记有没有放置炮
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; int map[10][10],mark[10][10],cont; int num[30][3]; int sum; int min(int a,int b) { return a<b?a:b; } int max(int a,int b) { return a>b?a:b; } int judge(int x1,int y1,int x2,int y2) { int t=0; if(x1==x2) { for(int i=min(y1,y2)+1;i<max(y1,y2);i++) if(map[x1][i]) t++; if(t==1) return 1; } else { t=0; for(int i=min(x1,x2)+1;i<max(x1,x2);i++) if(map[i][y1]) t++; if(t==1) return 1; } return 0; } int dfs(int t,int c) { int i; if(t==cont+1) { if(c>sum) sum=c; return 0; } dfs(t+1,c); for(i=1;i<t;i++) { if(mark[num[i][1]][num[i][2]]==1) if((num[t][1]==num[i][1]||num[t][2]==num[i][2])&&judge(num[t][1],num[t][2],num[i][1],num[i][2])) break; } if(i==t) { map[num[t][1]][num[t][2]]=mark[num[t][1]][num[t][2]]=1; dfs(t+1,c+1); map[num[t][1]][num[t][2]]=mark[num[t][1]][num[t][2]]=0; } return 0; } int main() { int i,j,q,a,b,n,m; while(~scanf("%d%d%d",&n,&m,&q)) { memset(map,0,sizeof(map)); for(i=1;i<=q;i++) { scanf("%d%d",&a,&b); map[a+1][b+1]=1; } memset(mark,0,sizeof(mark)); cont=0; for(i=1;i<=n;i++) for(j=1;j<=m;j++) { if(map[i][j]==0) { cont++; num[cont][1]=i; num[cont][2]=j; } } sum=0; if(cont==0) printf("0\n"); else { dfs(2,0); map[num[1][1]][num[1][2]]=mark[num[1][1]][num[1][2]]=1; dfs(2,1); printf("%d\n",sum); } } return 0; }
标签:dfs
原文地址:http://blog.csdn.net/zxf654073270/article/details/44196003