zoukankan      html  css  js  c++  java
  • hdu3368 dfs 下棋

    两颗黑子之间的白子可以翻装成黑子,两颗白子之间的黑子可以翻转成白子,对于一个给定位置,有八个方向有翻转其他颜色的子的可能。规则之一是下棋的位置一定要能翻转对方的子。

    求最优情况:黑子能翻转的白子个数的最大值。只要对有限的位置进行搜索就行,搜索8*8的位置,每个位置搜索八个方向,每个方向分别计算白子数量,直到遇到黑子,计算八个方向翻转

    的白子的和,更新最大值。

    下面两种代码稍有不同,当设置图的坐标为[1,8]*[1,8]时,边界可以不用管,当坐标是[0,7]*[0,7]时需要检查是否越界。

     1 /*171ms 1376k*/
     2 #include<iostream> 
     3 #include<cstdio>
     4 #include<string.h>
     5 using namespace std;
     6 char map[10][10];
     7 int kase,t;
     8 int sum;
     9 int MAX;
    10 int dir[8][2]{{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};
    11 int dfs(int x,int y)
    12 {
    13     sum=0;
    14     int xx,yy;
    15     for(int i=0;i<8;i++)
    16     {
    17        int num=0;//每个搜索方向开始时翻转白子的数量都置零 
    18         xx=x+dir[i][0];
    19         yy=y+dir[i][1];
    20        while(map[xx][yy]=='L')
    21        {
    22            num++;
    23            xx+=dir[i][0];
    24         yy+=dir[i][1];
    25        }
    26        if(map[xx][yy]=='D')sum+=num;//八个方向翻转的白子总和 
    27     }
    28     return sum;
    29 }
    30 int main()
    31 {
    32        scanf("%d",&t);
    33        for(kase=1;kase<=t;kase++)
    34        {
    35            int MAX=0;
    36            for(int i=1;i<=8;i++)
    37               for(int j=1;j<=8;j++)
    38               {
    39               scanf(" %c",&map[i][j]);}//要根据全局地图来判断max,所以先保存map,不能边存边计算 
    40         for(int i=1;i<=8;i++)
    41               for(int j=1;j<=8;j++)
    42               {
    43               if(map[i][j]=='*')
    44               {
    45                   MAX=max(MAX,dfs(i,j));
    46               }
    47            }
    48             printf("Case %d: %d
    ",kase,MAX);  
    49        }
    50 }
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef unsigned int ui;
     4 typedef long long ll;
     5 typedef unsigned long long ull;
     6 #define pf printf
     7 #define mem(a) memset(a,0,sizeof(a))
     8 #define prime1 1e9+7
     9 #define prime2 1e9+9
    10 #define scand(x) scanf("%llf",&x) 
    11 #define f(i,a,b) for(int i=a;i<=b;i++)
    12 #define scan(a) scanf("%d",&a)
    13 #define dbg(args) cout<<#args<<":"<<args<<endl;
    14 #define pb(i) push_back(i)
    15 #define ppb(x) pop_back(x)
    16 #define maxn 8
    17 int n,m,t;
    18 int Map[maxn][maxn];
    19 int dir[][2]={{0,1},{0,-1},{1,0},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};
    20 int dfs(int x,int y)
    21 {
    22     int cnt=0;
    23     int xx,yy;
    24     f(i,0,7)
    25     {
    26         int tot=0;
    27         int  xx=x+dir[i][0];
    28         int  yy=y+dir[i][1];
    29         if(xx>=8||xx<0||yy<0||yy>=8)continue;
    30         while((xx+dir[i][0])<=7&&(xx+dir[i][0])>=0&&(yy+dir[i][1])<=7&&(yy+dir[i][1])>=0&&Map[xx][yy]=='L')
    31         {
    32             tot++;
    33             xx+=dir[i][0];
    34             yy+=dir[i][1];
    35         }
    36         if(Map[xx][yy]=='D')cnt+=tot;
    37     }
    38     return cnt;
    39 }
    40 int ans;
    41 int main()
    42 {
    43     //freopen("input.txt","r",stdin);
    44     //freopen("output.txt","w",stdout);
    45     std::ios::sync_with_stdio(false);
    46     scan(n);
    47     f(tt,1,n)
    48     {
    49         ans=0;
    50         f(i,0,7)
    51             f(j,0,7)
    52             {
    53                 scanf(" %c",&Map[i][j]);
    54             }
    55         f(i,0,7)
    56             f(j,0,7)
    57             {
    58                 if(Map[i][j]=='*')
    59                 ans=max(ans,dfs(i,j));
    60             }
    61         pf("Case %d: %d
    ",tt,ans);
    62     }
    63  } 
  • 相关阅读:
    在Mac OS X上配置Apache2
    Safari on iOS 7 中Element.getClientRects的Bug
    Ubuntu 升级到13.10之后出现Apache2启动失败的问题
    HTML5中DOM元素的querySelector/querySelectorAll的工作机制
    TLS之上的HTTP
    Linux常用设置
    http 连接复用
    js数组的操作
    https学习总结
    教你使用shell数组
  • 原文地址:https://www.cnblogs.com/randy-lo/p/12384784.html
Copyright © 2011-2022 走看看