标签:
4 .X.. .... XX.. .... 2 XX .X 3 .X. X.X .X. 3 ... .XX .XX 4 .... .... .... .... 0
5 1 5 2 4
题意:
圆圈是炮台
黑色方块是墙
炮台不能打穿墙
2个炮台摆放的位置不能在同一行或同一列 ,否则炮台会相互攻击
找出在地图上最多能放多少个炮台
方法:深搜回溯
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; int n,vis[6][6],maxx; char map[6][6]; int check(int x,int y) { int i; if(vis[x][y]!=0) return 0; //四个方向 for(i=x-1; i>=0; i--) { if(vis[i][y]==1) break; else if(vis[i][y]==2) return 0; } for(i=x+1; i<n; i++) { if(vis[i][y]==1) break; else if(vis[i][y]==2) return 0; } for(i=y-1; i>=0; i--) { if(vis[x][i]==1) break; else if(vis[x][i]==2) return 0; } for(i=y+1; i<n; i++) { if(vis[x][i]==1) break; else if(vis[x][i]==2) return 0; } //printf("OK %d %d+",x,y); return 1; } int DFS(int deep) { for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { if(check(i,j)) {//printf("已经确认一个\n"); vis[i][j]=2;//2 炮塔 DFS(deep+1); vis[i][j]=0; // printf("已经删除一个\n"); } } } if(deep>maxx) maxx=deep; return maxx; } int main (void) { while(~scanf("%d",&n),n) { //memset(map,0,sizeof(map)); memset(vis,0,sizeof(vis)); getchar(); //printf("11"); for(int i=0; i<n; i++) { for(int ii=0; ii<n; ii++) { scanf("%c",&map[i][ii]); if(map[i][ii]=='X') vis[i][ii]=1;//1 强,这里输成小写x,查错好久 } getchar(); } maxx=0; printf("%d\n",DFS(0)); } return 0; }
标签:
原文地址:http://blog.csdn.net/qq_24653023/article/details/51897809