杭电 3368 Recersi DFS 搜索

本文介绍了一种基于棋盘状态的策略算法,通过放置黑棋实现最大数量的白棋翻转。使用DFS深度优先搜索策略,遍历所有可能的方向,并记录能够翻转的最大白棋数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:题意:给出了一个棋盘的状态,现在放一颗黑棋,问最多能把多少颗白旗翻转了,


翻转的规则是:这颗黑棋和另一颗黑棋连线之间都是白旗,则这些白旗都能被翻转.


思路: 找到空位,沿着一个方向开始一直搜素

#include<stdio.h>  
#include<string.h>  
int d[8][2]={-1,0, -1,1, 0,1, 1,1, 1,0, 1,-1, 0,-1, -1,-1};//8个方向  
char map[10][10];  
int maxn,sum;  
void Init()  
{  
   int i;  
   for(i=0;i<=9;i++)  
   {  
     map[i][0]='#';  
     map[i][9]='#';  
     map[0][i]='#';  
     map[9][i]='#';  
   }  
}  
void dfs(int x,int y,int num,int k)  
{  
   if(map[x][y]=='L')  
       dfs(x+d[k][0],y+d[k][1],num+1,k);  
   else if(map[x][y]=='D')  
   {  
      sum+=num;  
      return;  
   }  
   else return;  
}  
int main()  
{  
   int i,j,T,k,cas;  
   char ch[10];  
   scanf("%d",&T);  
   Init();  
   for(cas=1;cas<=T;cas++)  
   {  
       for(i=1;i<=8;i++)  
       {  
          scanf("%s",ch);  
          for(j=0;j<8;j++)  
             map[i][j+1]=ch[j];  
       }  
       maxn=0;  
       for(i=1;i<=8;i++)  
       {  
          for(j=1;j<=8;j++)  
          {  
            if(map[i][j]=='*')//在 * 处置黑子D  
            {  
                sum=0;  
              for(k=0;k<8;k++)  
              {  
                 if(map[i+d[k][0]][j+d[k][1]]=='L')  
                     dfs(i+d[k][0],j+d[k][1],0,k);  
              }  
              if(maxn<sum) maxn=sum;  
            }  
          }  
         
       }  
       printf("Case %d: %d\n",cas,maxn);  
   }  
   return 0;  
}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值