zoukankan      html  css  js  c++  java
  • P1331 海战

    思路:一开始想的是改一下深搜的方式,让它只遍历矩形块,然后在下面的遍历中判断是否出现矩形块交叉,但是很难实现,然后发现可以通过在遍历过程中判断是否合法。

    船体有交叉(连通块不是矩形)<=> 必定会在深搜过程中搜到如下的(a, b)位置(4种情况之一)

    所以在搜到这种情况时,直接返回false结束即可

    #include<iostream>
    #include<cstdio>
    
    using namespace std;
    
    const int N = 1010;
    
    char g[N][N];
    int st[N][N];
    int r, c;
    
    int dx[] = {-1, -1, 1, 1, 0, 1, 0, -1};
    int dy[] = {-1, 1, -1, 1, 1, 0, -1, 0};
    
    int dfs(int x, int y){
        st[x][y] = 1;
        for(int i = 0; i < 4; i ++){
            int nx = x + dx[i], ny = y + dy[i];
            if(nx >= 0 && ny >= 0 && nx < r && ny < c)
                if(g[nx][ny] == '.')
                    if(g[x][ny] == '#' && g[nx][y] == '#') return 0;
        }
        
        for(int i = 0; i < 4; i ++){
            int nx = x + dx[i + 4], ny = y + dy[i + 4];
            if(nx < 0 || ny < 0 || nx >= r || ny >= c) continue;
            if(st[nx][ny] || g[nx][ny] == '.') continue;
            if(!dfs(nx, ny)) return 0;
        }
        
        return 1;
    }
    
    int main(){
        cin >> r >> c;
        
        for(int i = 0; i < r; i ++) cin >> g[i];
        
        int res = 0;
        
        for(int i = 0; i < r; i ++)
            for(int j = 0; j < c; j ++)
                if(!st[i][j] && g[i][j] == '#')
                    if(dfs(i, j)) res ++;
                    else{
                        puts("Bad placement.");
                        return 0;
                    }
        
        printf("There are %d ships.", res);
        return 0;
    }
    
  • 相关阅读:
    MATLAB中的并行计算
    CVPR 2012 Highlights from Andrej Karpathy
    在.NET客户端程序中使用多线程
    AlcheMo
    笑笑
    字体模糊的解决办法 Windows Mobile
    打开windows mobile的输入模式
    XHTML MP 基础(手机网站开发基础技术)
    U盘修复资料
    历史上最昂贵的8大IT工程失误和教训
  • 原文地址:https://www.cnblogs.com/tomori/p/15027582.html
Copyright © 2011-2022 走看看