hdu 1045 DFS 建炮臺
//x代表墻 . 代表空地 , 第一行輸入n和m表示接下來有一個n*m的地圖,現(xiàn)在在空地上放置炮臺,判斷空地上最多可以放幾個炮臺,炮臺橫向和豎向會相互摧毀,但墻可以隔斷
//請輸出可以放置的最大炮臺數(shù)目
//Input 4 4
// ? ? ?.x..
// ? ? ?....
// ? ? ?x...
// ? ? ?....
//Output ?5
#include<bits/stdc++.h>
using namespace std;
int n,m;
char G[100][100];
char midg[100][100];
int ans;
int temp;
void Init_G()
{
? ?for(int i=0;i<n;i++)
? ? ? ?for(int j=0;j<m;j++)
? ? ? ? ? ?G[i][j]=midg[i][j];
}
//細節(jié)啊啊啊啊?。阂⒁獾扔诹愕倪吔缜闆r是OK的
bool judge(int x,int y)
{
? ?if(x<0||y<0||x>n||y>m)
? ?{
? ? ? ?//超過邊界
? ? ? ?return false;
? ?}
? ?//判斷此這個點是否可以放置炮臺
? ?//向上走:循環(huán)結(jié)束沒有return或者中途break了說明向上走是行得通的
? ?for(int i=x;i>=0;i--)
? ?{
? ? ? ?if(G[i][y]=='p')
? ? ? ? ? ?return false;//碰到炮臺了
? ? ? ?if(G[i][y]=='x')
? ? ? ? ? ?break;//碰到墻了
? ?}
? ?//向下走
? ?for(int i=x;i<n;i++)
? ?{
? ? ? ?if(G[i][y]=='p')
? ? ? ? ? ?return false;//碰到炮臺了
? ? ? ?if(G[i][y]=='x')
? ? ? ? ? ?break;//碰到墻了
? ?}
? ?//向左走
? ?for(int i=y;i>=0;i--)
? ?{
? ? ? ?if(G[x][i]=='p')
? ? ? ? ? ?return false;//碰到炮臺了
? ? ? ?if(G[x][i]=='x')
? ? ? ? ? ?break;//碰到墻了
? ?}
? ?//向右走
? ?for(int i=y;i<m;i++)
? ?{
? ? ? ?if(G[x][i]=='p')
? ? ? ? ? ?return false;//碰到炮臺了
? ? ? ?if(G[x][i]=='x')
? ? ? ? ? ?break;//碰到墻了
? ?}
? ?//上述四個循環(huán)結(jié)束可以走到一下這一步說明四面都可以走通
? ?return true;
}
int shensou(int x,int y)
{
? ?//一般地圖問題都需要坐標的輔助
? ?//如果是空地并且判斷可以放置則放置炮臺
? ?if(G[x][y]=='.'&&judge(x,y)==true)
? ?{
? ? ? ?G[x][y] = 'p';//放置一個炮臺
? ? ? ?temp++;
? ? ? ?//遞歸深搜
? ? ? ?for(int i=0;i<n;i++)
? ? ? ? ? ?for(int j=0;j<m;j++)
? ? ? ? ? ?{
? ? ? ? ? ? ? ?if(G[i][j]=='.'&&judge(i,j)==true)
? ? ? ? ? ? ? ? ? ?shensou(i,j);
? ? ? ? ? ?}
? ?}
? ?//最底層層遞歸返回temp
? ?return temp;
}
int main()
{
? ?ans=0;
? ?scanf("%d%d",&n,&m);
? ?for(int i=0;i<n;i++)
? ? ? ?for(int j=0;j<m;j++)
? ? ? ?{
? ? ? ? ? ?cin>>G[i][j];
? ? ? ? ? ?midg[i][j]=G[i][j];
? ? ? ?}
? ?for(int i=0;i<n;i++)
? ?{
? ? ? ?for (int j = 0; j < m; j++)
? ? ? ?{
? ? ? ? ? ?printf("%c", G[i][j]);
? ? ? ?}
? ? ? ?printf("\n");
? ?}
? ?//對圖中每一個深搜取最多的炮臺數(shù)目
? ?for(int i=0;i<n;i++)
? ? ? ?for(int j=0;j<m;j++)
? ? ? ?{
? ? ? ? ? ?temp=0;
? ? ? ? ? ?Init_G();//每次深搜都初始化一下圖
? ? ? ? ? ?//從空地深搜且每次深搜重置此次中間結(jié)果
? ? ? ? ? ?if(G[i][j]=='.'&& judge(i,j)==true)
? ? ? ? ? ?{
? ? ? ? ? ? ? ?//從沒一點開始深搜統(tǒng)計此次深搜的炮臺數(shù)取最大
? ? ? ? ? ? ? ?temp=shensou(i,j);
? ? ? ? ? ? ? ?ans = max(ans,temp);
? ? ? ? ? ?}
? ? ? ?}
? ?cout<<ans;
? ?return 0;
}