吉首大学第九届"新星杯"大学生程序设计大赛 C.始战

吉首大学第九届"新星杯"大学生程序设计大赛 C.始战

题目描述

天地不仁,以万物为刍狗。
东汉末年,群雄并起。十八路诸侯各自为战,为得一地一城,大肆征战,民众死伤无数。
诸葛亮密如神鬼,疾如风雷。进不可挡,退不可追。昼不可攻,夜不可袭。多不可敌,少不可欺。前后应会,左右指挥。移五行之性,变四时之令。
神人也。
现,亮得诸侯割据图。亮根据此图,预测第一战将会在何处爆发。
此图由n*m个单位组成,图中有n个诸侯的根据地所在地,每个诸侯只会在第一天都会向自己根据地的上下左右方向霸占土地。当两个诸侯霸占到同一块土地时,那么此两诸侯就会开战。现问第一场战役将会在何处爆发!
注意:此土地被霸占的前提条件是在这一天还未被别的诸侯霸占,如果已经被别的诸侯霸占了,那么他就无法霸占了,当然也不会开战,因为谁先到,就是谁的土地。但是如果这块土地,是一起到达的,那么就会开战。

输入描述

多组输入
n,m表示此图由n行m列组成 (1<= n,m<= 100),左上角的坐标是(1,1).
下跟n行m列矩阵,矩阵由*和#组成,一个#代表着一个诸侯,其余代表此土地待征服。 保证割据图中最多只有十八位诸侯,最少没有诸侯。

输出描述

输出第一场战争的(x,y)坐标
如果不会爆发战争,请输入-1.
如果多个地方同时爆发第一场战争,那么请先按x排序,再按y排序,依次输出。
如果爆发战争输出格式为:
1 2
2 5
此表示第一场战争将在(1,2)和(2,5)两个点爆发。

示例1

输入

5 5
*****
****#
*****
*****
****#
6 8
###*#*#*
**#*****
********
********
********
********

输出

-1
1 4
1 6
2 2

看完题解真的吐了,每个诸侯居然只动一次……,然后很快就A了

#include
using namespace std;
typedef long long ll;

int main()
{
    int n,m;
    while(cin>>n>>m){
        char s[105][105];
        int a[105][105];
        memset(a,0,sizeof(a));
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                cin>>s[i][j];
            }
        }
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(s[i][j]=='#'){
                    if(i-1>=0) a[i-1][j]++;
                    if(i+1<n) a[i+1][j]++;
                    if(j-1>=0) a[i][j-1]++;
                    if(j+1<m) a[i][j+1]++;
                }
            }
        }
        int flag=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(s[i][j]!='#' && a[i][j]>1){
                    flag=1;
                    cout<<i+1<<" "<<j+1<<endl;
                }
            }
        }
        if(!flag) cout<<-1<<endl;
    }
    return 0;
}

你可能感兴趣的:(BFS,牛客,模拟)