2018年东北农业大学春季校赛 wyh的矩阵

链接:https://www.nowcoder.com/acm/contest/93/H
来源:牛客网

题目描述

最近吃鸡游戏非常火,你们wyh学长也在玩这款游戏,这款游戏有一个非常重要的过程,就是要跑到安全区内,否则就会中毒持续消耗血量,我们这个问题简化如下

假设地图为n*n的一个图,图中有且仅有一块X的联通快代表安全区域,有一个起点S代表缩圈的时候的起点,图中C代表的是车(保证车的数量小于等于100),标记为.的代表空地,可以任意通过,O代表障碍物不能通过。每次没有车的时候2s可以走一个格(只能走自己的上下左右4个方向),有车的话时间为1s走一个格

现在告诉你最多能坚持的时间为t秒,问你在t秒内(含t秒)能否从s点到达安全区域,能的话输出YES,并且输出最短时间,不能的话输出NO

输入描述:

输入第一行一个整数T(1<=T<=10)
接下来有T组测试数据,每组测试数据输入2个数n和k(1<=n<=100,1<=k<=10^9)
接下来n行,每行n个字符,代表对应的n*n的地图,每个字符都是上面的一种,并且保证只有一个起点,只有一块安全区域。

输出描述:

对于每组测试数据,先输出能否到达,能的话输出YES,然后换行输出最短时间,如果不能的话直接输出NO
示例1

输入

3
2 3
.X
S.
2 3
.X
SC
2 4
.X
S.

输出

NO
YES
3
YES
4
#include<iostream>
using namespace std;
#include<cstdio>
#include<cstring>
#include<cstdlib>
typedef long long ll;
void deal(){
    ll n;
    cin>>n;
    ll p = n/2+1;
    ll q = n;
    ll sum = 0;
    sum = ((p+(p+n*(n-1)))*q)/2;
//    cout<<"*"<<sum<<endl;
    for(int i=n/2;i>=1;i--){
        p+=(n-1);
        q-=2;
    //    cout<<p<<" "<<q<<" "<<p+n*(q-1)<<endl;
        sum+=((p+(p+n*(q-1)))*q)/2;
    }
    p = n/2+1,q=n;
    for(int i=n/2+2;i<=n;i++){
        p+=(n+1);
        q-=2;
    //    cout<<p<<" "<<q<<" "<<p+n*(q-1)<<endl;
        sum+=((p+(p+n*(q-1)))*q)/2;
    }
    cout<<sum<<endl;
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--)
        deal();
    return 0;
}

 

posted @ 2018-04-06 14:58  晓风微微  阅读(247)  评论(0编辑  收藏  举报