• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
dwtfukgv
博客园    首页    新随笔    联系   管理    订阅  订阅
HDU 3368 Reversi (暴力,DFS)

题意:给定一个8*8的棋盘,然后要懂黑白棋,现在是黑棋走了,问你放一个黑子,最多能翻白子多少个。

析:我是这么想的,反正才是8*8的棋盘,那么就暴吧,反正不会超时,把每一个格能暴力的都暴力,无非是上,下,左,右,左上,左下,右上,右下,

然后都试试就好了。不过懂点黑白棋的还是好做一点。

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <algorithm>

using namespace std;
const int maxn = 10 + 5;
const int dr[] = {0, 0, 1, -1, 1, -1, -1, 1};
const int dc[] = {1, -1, 1, -1, -1, 1, 0, 0};
char s[maxn][maxn];
int vis[maxn][maxn];

int dfs(int x, int y, int r, int c){
    int xx = r + x;
    int yy = c + y;
    if(xx < 0 || yy < 0 || xx > 7 || yy > 7)  return 0;
    vis[x][y] = 1;
    if(s[xx][yy] == 'D' || s[xx][yy] == '*') return 0;
    if(s[xx][yy] == 'L' && !vis[xx][yy])  return 1 + dfs(xx, yy, r, c);
    else if(s[xx][yy] == 'L' && vis[xx][yy])  return dfs(xx, yy, r, c);
    return 0;
}

int main(){
    int n;
    cin >> n;

    for(int kase = 1; kase <= n; ++kase){
        memset(vis, 0, sizeof(vis));
//        int ans = 0;
        for(int i = 0; i < 8; ++i)
            scanf("%s", s[i]);
        int ans = 0;

        for(int i = 0; i < 8; ++i){
            for(int j = 0; j < 8; ++j){
                int cnt = 0;
                memset(vis, 0, sizeof(vis));
                if(s[i][j] == '*'){

                    for(int k = 0; k < 8; ++k){
                        int xx = i, yy = j;
                        bool ok = false;
                        while(xx >= 0 && xx < 8 && yy >= 0 && yy < 8){
                            if(s[xx][yy] == 'D'){ ok = true;  break; }
                            xx += dr[k];
                            yy += dc[k];
                            if(s[xx][yy] == '*') break;
                        }
                        if(ok){  cnt += dfs(i, j, dr[k], dc[k]);   }

                    }
                }
                ans = max(ans, cnt);
            }
        }


        printf("Case %d: %d\n", kase, ans);
    }
    return 0;
}

 

 

#include <iostream>
#include <cstdio>
#include <cstring>


using namespace std;
const int maxn = 200 + 5;
const int dr[] = {0, 0, 1, -1, 1, -1, -1, 1};
const int dc[] = {1, -1, 1, -1, -1, 1, 0, 0};
char s[10][10];

int dfs(int i, int j, int r, int c){
    if(i < 0 || j < 0 || i > 7 || j > 8)  return -1000;
    else if(s[i][j] == '*')   return -1000;
    else if(s[i][j] == 'D')   return 0;
    else  return 1 + dfs(i+r, c+j, r, c);
}

int main(){
    int T;
    cin >> T;
    for(int kase = 1; kase <= T; ++kase){
        for(int i = 0; i < 8; ++i)
            scanf("%s", s[i]);
        int ans = 0;
        for(int i = 0; i < 8; ++i)
            for(int j = 0; j < 8; ++j)
                if(s[i][j] == '*'){
                    int cnt = 0;
                    for(int k = 0; k < 8; ++k)
                        cnt += max(0, dfs(i+dr[k], j+dc[k], dr[k], dc[k]));
                    ans = max(ans, cnt);
                }

        printf("Case %d: %d\n", kase, ans);

    }
    return 0;
}

 

posted on 2016-07-26 23:24  dwtfukgv  阅读(224)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3