【ZCMU1434】糖果迷阵
題目鏈接
1434: 糖果迷陣
Time Limit: 1 Sec??Memory Limit: 128 MB
Submit: 93??Solved: 44
[Submit][Status][Web Board]
Description
?
Inna 喜歡吃糖和游戲糖果迷陣.今天,他推出了新游戲“糖果迷陣2:刷新”。
游戲由一個nxm的矩陣表組成。矩陣每行包含一個帶有侏儒的單元格和一塊帶有糖果的單元格,和一些空的單元格。游戲有多次操作,每次操作玩家需要選中所有那些侏儒沒獲得糖果的行,并發出指令“Let’s go!”.之后所有選中行的侏儒開始同時向右移動,每秒每個侏儒只能向當前單元格的右側相鄰單元格移動一格,操作一直持續到發生以下事件之一時:
·一些侏儒到達所在行的最右邊
·一些侏儒到達糖果所在單元格獲得糖果
當所有侏儒得到糖果時結束
Inna是如此聰明得設計出這個游戲. 可是你們呢? 你的任務是用最優的方法來完成這個游戲,也就是用最少的操作來完成這個游戲。
?
Input
輸入的第一行包含兩個整數n和m(1≤N≤1000;2≤M≤1000)。
每個接下來的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); 輸入
?
Source
?
解題思路:
乍一看還以為是到模擬題,但實際上比想象的要簡單qaq
先判斷一下是否可以完成游戲,只要當每一行的G在S之即可完成游戲,反之有一行不滿足則不能完成。
然后只需計算每一行的G和S之差記錄到數組中進行排序,因為當一些侏儒到達糖果所在單元格獲得糖果時一輪就結束了,所以只需要每次取出數組中最小的數,將其標為0表示已經獲得糖果,其他數減去這個最小的數即代表他們在這一輪中移動的位置,再次排序,進行上述操作,當數組中的元素全為不大于0的數時表示游戲結束,輸出答案。
?
代碼:
#include<bits/stdc++.h> using namespace std; int a[1005],n,m; int judge() {for(int i=0;i<n;i++){if(a[i]>0)return 1;}return 0; } int main() {while(~scanf("%d%d",&n,&m)){char s[n][m];int flag=0,ans=0,k=0,i,j;for(i=0;i<n;i++)scanf("%s",s[i]);for(i=0;i<n;i++){int x,y;for(j=0;j<m;j++){if(s[i][j]=='G')x=j;if(s[i][j]=='S')y=j;}if(y<x)flag=1;else a[k++]=y-x;}if(flag)printf("-1\n");else{while(judge()){sort(a,a+k);for(i=0;a[i]<=0;i++);int x=a[i];for(j=0;j<n;j++)a[j]=a[j]-x; ans++;//for(i=0;i<n;i++)cout<<a[i]<<" ";//cout<<endl; } printf("%d\n",ans); }}return 0; }?
總結
以上是生活随笔為你收集整理的【ZCMU1434】糖果迷阵的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue进阶(幺贰零):父组件获取子组件验
- 下一篇: DVD PullDown 详解