HDU1045 Fire Net(DFS、八皇后类问题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1045

题目类似于八皇后的问题,炮塔可以打四个方向无限远,但是无法穿过墙,问你一个地图最多可以放多少个炮塔而不互相攻击

AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
 char map[5][5];
 int vis[5][5];
 int n;
 int maxx;
 int judge(int xx,int yy)
 {
 	int i;
 	for(i=xx;i>=0;i--)
 	{
 		if(vis[i][yy]==1) 
 			return 0;
 		if(map[i][yy]=='X') 
 			break;
	 }
	 for(i=yy;i>=0;i--)
	 {
	 	if(vis[xx][i]==1)
		 return 0;
		 if(map[xx][i]=='X')
		 break;
	 }
	 return 1;
 }
 void dfs(int num,int cnt)//num是当前搜索到的点,cnt已经放置炮台的数量 
 {
 	if(num==n*n)  //num是从1到n*n的,怎样根据num得到x,y在下边 
 	{
 		maxx=max(maxx,cnt);
 		return;
	 }
	int x=num/n;   //获取当前点的坐标 
	int y=num%n;
	if(map[x][y]=='.'&&judge(x,y))
	{
		vis[x][y]=1;
		dfs(num+1,cnt+1);
		vis[x][y]=0;
	}
	dfs(num+1,cnt);
 }
int main()
{
	while(scanf("%d",&n)&&n)
	{
		int i,j;
		maxx=0;
		for(i=0;i<n;i++)
		{
			scanf("%s",map[i]);
		}
		dfs(0,0);
	/*	for(i=0;i<n;i++)
		{
			for(j=0;j<n;j++)
			{
				cout<<a[i][j];
			}
			printf("\n");
		}      */
		 cout<<maxx<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/zvenWang/article/details/82013189
今日推荐