【DFS】hdu 1045 Fire Net

51 篇文章 0 订阅
12 篇文章 0 订阅

http://acm.hdu.edu.cn/showproblem.php?pid=1045

分析:从第一个点到最后一个点依此暴搜


#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

const int NM=10;
char str[NM][NM];
bool vis[NM][NM];
int mmax,num,n;

bool check(int x,int y){
	//反向检查
	for(int i=x-1;i>=0;i--){
		if(str[i][y]=='X') break;
		else if(vis[i][y]) return false;
	}
	for(int j=y-1;j>=0;j--){
		if(str[x][j]=='X') break;
		else if(vis[x][j]) return false;
	}
	return true;
}

void DFS(int t,int ans)
{
	int x,y;
	if(t==num){
		if(ans>mmax) mmax=ans;
		return;
	}
	x=t/n;y=t%n;
	if(str[x][y]!='X' && check(x,y)){
		vis[x][y]=1;
		DFS(t+1,ans+1);
		vis[x][y]=0;
	}
	DFS(t+1,ans);  //
}

int main()
{
	while(scanf("%d",&n) && n){
		for(int i=0;i<n;i++){
			scanf("%s",str[i]);
		}
		num=n*n;
		memset(vis,0,sizeof(vis));
		mmax=0;
		DFS(0,0);
		printf("%d\n",mmax);
	}
	return 0;
}

#include<iostream>
#include<cstdio>
using namespace std;

char str[5][5];
int MAX,n;

void DFS(int i,int ans)
{
	int x,y,j,flag;
	if(i==n*n)
	{
		if(ans>MAX)
			MAX=ans;
		return;
	}
	
	x=i/n;
	y=i%n;
	flag=0;
	if(str[x][y]=='.')
	{
		for(j=x-1;j>=0;j--)  //从后往前找,遇到'X'跳出
		{
			if(str[j][y]=='*') flag=1;
			if(str[j][y]=='X') break;
		}
		for(j=y-1;j>=0;j--)
		{
			if(str[x][j]=='*') flag=1;
			if(str[x][j]=='X') break;
		}
		if(!flag)
		{
			str[x][y]='*';
			DFS(i+1,ans+1);//
			str[x][y]='.';
		}
	}
	DFS(i+1,ans);//
}

int main()
{
	int i;
	while(cin>>n&&n)
	{
		for(i=0;i<n;i++)
			cin>>str[i];
		MAX=0;
		DFS(0,0);
		cout<<MAX<<endl;
	}
	return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值