4459: 三子棋

题目描述

题目描述

33DAI 很喜欢三子棋。今天他在一张很大的方形棋盘上下棋,棋盘可以看作是一个 �n 行 �m 列的网格。(大家应该知道三子棋是下在格子里面的吧?)

33DAI 今天的玩法非常不一样。棋盘上有些位置上有棋子,有些位置上没有。所有的棋子都是己方棋子。33DAI 可以任选一个空着的位置下棋。如果他落子的位置能和周边的另外两个棋子构成三连(横着、竖着、斜着都可以),那么这就是一个好位置。

请你帮 33DAI 找找棋盘上有多少个好位置吧!

输入格式

第一行为空格隔开的两整数 �n,�m。

接下来 �n 行,每行为 �m 个字符,描述了整个棋盘,第 �i 行第 �j 列的字符为 ��,�gi,j​,描述了第 �i 行第 �j 列的格子。

如果字符为 . 则表示这个位置没有棋子,如果字符为 # 则表示这个位置有一个己方棋子。

输出格式

一行一个整数,表示有多少个空着的位置是好位置。

输入1:

5 7
.......
...#...
...##..
.......
...#..#

输出1:

6

样例解释

下面用字符 o 标出了所有好位置

..oo...
...#...
..o##o.
...o.o.
...#..#

数据规模与约定

对于 100%100% 的数据,1≤�,�≤501≤n,m≤50,��,�gi,j​ 为 .# 中的一种。

  • 子任务 1(3030 分):保证有且仅有两个位置为 #
  • 子任务 2(3030 分):保证每个 # 与其他 # 的行数要么相同,要么相差大于 22。即不会产生竖着、斜着的三连。
  • 子任务 3(4040 分):无特殊限制

#include<bits/stdc++.h>
using namespace std;
char x[55][55];
int main(){
int n,m,k = 0;
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
        cin>>x[i][j];
    }
    }
    for(int i=0;i<n;i++){
    for(int j=0;j<m;j++){
    if(x[i][j]=='.'){
    if(x[i+1][j]=='#'&&x[i+2][j]=='#'){
    k++;
    }else if(x[i-1][j]=='#'&&x[i-2][j]=='#'){
    k++;
    }else if(x[i-1][j]=='#'&&x[i+1][j]=='#'){
    k++;
    }else if(x[i][j-1]=='#'&&x[i][j-2]=='#'){
    k++;
    }else if(x[i][j+1]=='#'&&x[i][j+2]=='#'){
    k++;
    }else if(x[i][j-1]=='#'&&x[i][j+1]=='#'){
    k++;
    }else if(x[i-1][j-1]=='#'&&x[i-2][j-2]=='#'){
    k++;
    }else if(x[i+1][j+1]=='#'&&x[i+2][j+2]=='#'){
    k++;
    }else if(x[i-1][j-1]=='#'&&x[i+1][j+1]=='#'){
    k++;
    }else if(x[i-1][j+1]=='#'&&x[i-2][j+2]=='#'){
    k++;
    }else if(x[i+1][j-1]=='#'&&x[i+2][j-2]=='#'){
    k++;
    }else if(x[i-1][j+1]=='#'&&x[i+1][j-1]=='#'){
    k++;
    }
    }
    }
    }
    cout<<k; 
    return 0;

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值