C - 菱形カウント / AtCoderBeginnerContest#018

abc018.contest.atcoder.jp

#include <iostream>
#include <string>
using namespace std;

int r, c, k;
string s[500];

void check(int y, int x) {
    for (int i=0; i<k; ++i)
        for (int j=0; j<k-i; ++j) {
            if (0<=y+i && y+i<r) {
                if (0<=x+j && x+j<c && s[y+i][x+j]!='x') s[y+i][x+j]='*';
                if (0<=x-j && x-j<c && s[y+i][x-j]!='x') s[y+i][x-j]='*';
            }
            if (0<=y-i && y-i<r) {
                if (0<=x+j && x+j<c && s[y-i][x+j]!='x') s[y-i][x+j]='*';
                if (0<=x-j && x-j<c && s[y-i][x-j]!='x') s[y-i][x-j]='*';
            }
        }
}

void Solve(void) {
    int answer=0;

    for (int i=0; i<r; ++i)
        cin >> s[i];
    for (int i=0; i<r; ++i)
        for (int j=0; j<c; ++j)
            if (s[i][j] == 'x')    check(i,j);
    for (int i=0; i<r; ++i)
        for (int j=0; j<c; ++j)
            if (i<k-1 || r-k<i || j<k-1 || c-k<j)   s[i][j]='x';
    for (int i=0; i<r; ++i)
        for(int j=0; j<c; ++j)
            if (s[i][j] == 'o') ++answer;
    cout << answer << endl;
}

int main(void)  {
    cin >> r >> c >> k;
    Solve();
    return 0;
}

作れない箇所を埋めていき、最終残った場所が菱形が作れる箇所なので足し上げ出力。
~了~