标签:

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