zcmu Problem H: 糖果迷阵

【题目】

Problem H: 糖果迷阵

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 88  Solved: 41
[Submit][Status][Web Board]

Description

Inna 喜欢吃糖和游戏糖果迷阵.今天,他推出了新游戏“糖果迷阵2:刷新”。

游戏由一个nxm的矩阵表组成。矩阵每行包含一个带有侏儒的单元格和一块带有糖果的单元格,和一些空的单元格。游戏有多次操作,每次操作玩家需要选中所有那些侏儒没获得糖果的行,并发出指令“Let’s go!.之后所有选中行的侏儒开始同时向右移动,每秒每个侏儒只能向当前单元格的右侧相邻单元格移动一格,操作一直持续到发生以下事件之一时:

·一些侏儒到达所在行的最右边

·一些侏儒到达糖果所在单元格获得糖果

当所有侏儒得到糖果时结束

Inna是如此聪明得设计出这个游戏. 可是你们呢? 你的任务是用最优的方法来完成这个游戏,也就是用最少的操作来完成这个游戏。

Input

输入的第一行包含两个整数nm1N1000;2M1000)。

每个接下来的n行包含m个字符代表这局的“糖果迷阵:刷新”。字符“*”表示该领域的空白单元格,字符“G”代表一个侏儒和字符“S”代表一个糖果。矩阵不包含其他字符。这是保证每行包含一个字符“G”和一个字符“S”。

Output

在一行打印单个整数 - 来表示完成游戏的最优解,或-1如果目标不能在给定的游戏场中可以实现所需的运动或最小数目。

Sample Input

3 4
*G*S
G**S
*G*S
1 3
S*G

Sample Output

2
-1

HINT

 请使用cin>>str; 或者scanf("%s",str); 输入

【题解】

题意:一行一个侏儒一个糖果,做向右的移动操作,问至少做多少次操作使得所有侏儒吃到糖果。

思路:要求所有糖果在侏儒的右边,输出糖果和侏儒之间的距离的不同情况数。

【代码】

#include <bits/stdc++.h> 
using namespace std; 
int main() 
{ 
    int n,m,i,j,k; 
    char a[1005]; 
    int b,c,vis[1005]; 
    while(~scanf("%d%d",&n,&m)) 
    { 
        int f=1,ans=0; 
        memset(vis,0,sizeof(vis)); 
        for(k=0;k<n;k++) 
        { 
            scanf(" %s",a); 
            for(i=0;i<m;i++) 
                if(a[i]=='G') 
                   b=i; 
                else if(a[i]=='S') 
                    c=i; 
            if(c-b>0) 
            { 
                if(vis[c-b]==0) 
                { 
                    ans++; 
                    vis[c-b]=1; 
                } 
            } 
            else
            { 
                f=0;break; 
            } 
        } 
        if(f) 
            printf("%d\n",ans); 
        else
            printf("-1\n"); 
    } 
    return 0; 
} 

猜你喜欢

转载自blog.csdn.net/qq_41117236/article/details/81117893
今日推荐