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\n",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\n",tt,ans); 62 } 63 }
每一个不曾起舞的日子,都是对生命的辜负。