Fire Net(HD1045)

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

解题思路:用dfs进行搜索

             示例:.  .  .  搜索第一个点,可以放置碉堡,标记为'O',接下来的点都不能放置,然后回溯到第一个点,此时第一个点为'.',在搜索第二个点,放置碉堡,第三个点不能放,

                     .  X X 标记为'O',第四个点可放置,标记为'O',继续往后搜索时,其他顶点都不能放置,回溯到第四个顶点,此时第四个顶点为'.',继续往后搜索,搜到第七个顶点时可放置碉堡...

                     .  X X代码:

#include<stdio.h>
using namespace std;
char map[4][4];
int max,temp,n;
void dfs(int num)
{
  if(num==n*n)
  {
    if(max<temp)
    max=temp;
    return;
  }
   int row=num/n;
   int col=num%n;
   bool judge=true;//true是可以安装
   if(map[row][col]=='.'){
   for(int i=row-1;i>=0&&judge;i--)
   {
     if(map[i][col]=='X')break;
     if(map[i][col]=='O')
     {
        judge=false;
        break;
     }
   }
   for(int j=col-1;j>=0&&judge;j--)
   {
     if(map[row][j]=='X')break;
     if(map[row][j]=='O')
     {
        judge=false;
        break;
     }
   }
   if(judge)
   {
     temp++;
     map[row][col]='O';
     dfs(num+1);
     temp--;
     map[row][col]='.';
   }
   }
     dfs(num+1);
}
int main()
{
   while(~scanf("%d",&n)&&n!=0){
   max=0;temp=0;
   for(int i=0;i<n;i++)
     for(int j=0;j<n;j++)
      scanf("%1s",&map[i][j]);
   dfs(0);
   printf("%d\n",max);
   }
}

 

posted @ 2013-05-30 15:23  supersnow0622  Views(148)  Comments(0)    收藏  举报