hdu3368 dfs 下棋

Posted randy-lo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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  } 

 

以上是关于hdu3368 dfs 下棋的主要内容,如果未能解决你的问题,请参考以下文章

CCF(棋局评估)博弈论+对抗搜索+DFS

HDU 1016(DFS_B题)解题报告

HDU - 1427 / UESTC - 1252 经典dfs

小木棒HDU1455(DFS+剪枝)

DFS——hdu1241Oil Deposits

hdu1241 dfs