1. 程式人生 > >hdu1045 Fire Net dfs

hdu1045 Fire Net dfs

#include <bits/stdc++.h>
using namespace std;
char mp[5][5];
int n,maxn;
bool ok(int x,int y){
	if(mp[x][y]=='x'||mp[x][y]=='X')
	return false;
	for(int i=y;i<=n;i++){
		if(mp[x][i]=='x')
		return false;
		if(mp[x][i]=='X')
		break;
	}
	for(int i=y;i>=1;i--){
		if(mp[x][i]=='x')
		return false;
		if(mp[x][i]=='X')
		break;
	}
	for(int i=x;i<=n;i++){
		if(mp[i][y]=='x')
		return false;
		if(mp[i][y]=='X')
		break;
	}
	for(int i=x;i>=1;i--){
		if(mp[i][y]=='x')
		return false;
		if(mp[i][y]=='X')
		break;
	}
	return 1;
}
void dfs(int c_x,int c_y,int c_n){
	int dx=0;
	int dy=0;
	if(maxn<c_n) maxn=c_n;
	for(int i=c_x;i<=n;i++){
		for(int j=1;j<=n;j++){//在該位之後找 
			if(i==c_x&&j<=c_y)
			continue;
			if(!ok(i,j)) continue;//判斷該點是否能放 
			dx=i; dy=j;
			mp[i][j]='x';
			dfs(dx,dy,c_n+1);
			mp[i][j]='.';
		}
	}
	if(dx==0&&dy==0) return ;//找不到新的可放位置結束 
}
int main(){
	while(cin>>n&&n){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++)
			cin>>mp[i][j];
		}
		maxn=-1;
		dfs(1,0,0);
		cout<<maxn<<endl;
		/*for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++)
		cout<<mp[i][j]<<' ';
		cout<<endl;
		}*/
		
	}
}