题目描述

学校组织活动,将学生排成一个矩形方阵。请在矩形方阵中找到最大的位置相连的男生数量。这个相连位置在一个直线上,方向可以是水平的、垂直的、呈对角线的或者反对角线的。 注:学生个数不会超过10000.

输入描述:

输入的第一行为矩阵的行数和列数,接下来的n行为矩阵元素,元素间用“,”分隔。

输出描述:

输出一个整数,表示矩阵中最长的位置相连的男生个数。

示例1

输入
3,4
F,M,M,F
F,M,M,F
F,F,F,M

输出
3

测试用例

4,5
H,M,H,M,H
H,M,H,M,H
H,M,H,M,H
H,M,H,M,H
4

4,5
M,M,M,M,M
H,M,H,M,H
H,M,H,M,H
H,M,H,M,H
5

4,5
M,M,H,M,H
H,M,H,M,H
H,H,M,H,H
H,M,H,M,H
4

4,5
M,M,H,M,M
H,H,H,M,H
H,H,M,H,H
H,M,H,M,H
4

4,5
M,M,H,M,M
H,H,H,H,M
H,H,M,M,H
H,M,M,H,H
3

C语言题解:

todo
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>
#define MAX 105
int n,m;
int g[MAX][MAX] = {0};
int main()
{
    scanf("%d,%d", &n, &m);//printf("%d %d\n", n, m);
    char s[500] = {0};
    for (int i=0; i<n; i++) {    
        scanf("%s", s);//printf("%s\n", s);
        for (int j=0; j<m; j++) {
            //printf("%c", s[j*2]);
            if (s[j*2] == 'M') {
                g[i][j] = 1;
            }
        }
    }

    int max = 0;
    for (int i=0; i<n; i++) { // 从左到右
        int k = 0;
        int cnt = 0;
        while (k<m) {
            //printf("%d ", g[i][k]);
            if (g[i][k] == 1) {
                cnt++;
                if (cnt > max) {
                    max = cnt;
                }
            } else {
                cnt = 0;
            }
            k++;
        }
    }

    for (int i=0; i<n; i++) { // 左上到右下
        int k = 0;
        int cnt = 0;
        int x = i;
        while (k<m && x<n) {//printf("%d ", g[x][k]);
            if (g[x][k] == 1) {
                cnt++;
                if (cnt > max) {
                    max = cnt;
                }
            } else {
                cnt = 0;
            }
            k++;
            x++;
        }
    }
    
    for (int j=0; j<m; j++) { // 从上到下
        int k = 0;
        int cnt = 0;
        while (k<n) {
            if (g[k][j] == 1) {
                cnt++;
                if (cnt > max) {
                    max = cnt;
                }
            } else {
                cnt = 0;
            }
            k++;
        }
    }
    for (int j=0; j<m; j++) { // 左上到右下
        int k = 0;
        int cnt = 0;
        int y = j;
        while (k<n && y<m) {
            if (g[k][y] == 1) {
                cnt++;
                if (cnt > max) {
                    max = cnt;
                }
            } else {
                cnt = 0;
            }
            k++;
            y++;
        }
    }
    for (int j=0; j<m; j++) { // 右上到左下
        int k = 0;
        int cnt = 0;
        int y = j;
        while (k<n && y>=0) {
            if (g[k][y] == 1) {
                cnt++;
                if (cnt > max) {
                    max = cnt;
                }
            } else {
                cnt = 0;
            }
            k++;
            y--;
        }
    }
    for (int i=0; i<n; i++) { // 右上到左下
        int k = m-1;
        int cnt = 0;
        int x = i;
        while (k>=0) {
            if (g[x][k] == 1) {
                cnt++;
                if (cnt > max) {
                    max = cnt;
                }
            } else {
                cnt = 0;
            }
            x++;
            k--;
        }
    }     
    printf("%d\n", max);
    return 0;
}