2013年10月24日 星期四

[HOJ] 294 - The Evil Temple and the Moving Rocks

Problem : 294 - The Evil Temple and the Moving Rocks

Special Judge

Problem:
hh是一個神祕的龍使,在hh奮力的殺了幾隻弱弱的小怪後,抵達了一個四周都是牆壁,由 N x N 塊磁磚所構成的房間,裡面空無一物。

此時hh發現牆上寫著:要抵達下一個房間,你就必須依靠石頭所發出的聲音!

做為一個優秀的龍使,hh馬上就知道該如何處理這種狀況,hh有4種石頭:

  •'^': 這種石頭只會往上移動。
  •'<': 這種石頭只會往左移動。
  •'>': 這種石頭只會往右移動。
  •'v': 這種石頭只會左下移動。

由於hh非常厲害,所以他的包包中裝了無限顆的這些石頭,為了抵達下個房間,hh必須在一些磁磚上放上石頭(每個磁磚上只能放一顆石頭,否則房間會爆炸!),然後hh會使用魔法讓一顆石頭產生魔法能量,此時這顆石頭會依據自己的種類移動一格,並消耗掉 1 單位的魔力,直到撞到另一顆石頭或牆壁才停止(若一開始障礙已在他面前,這顆石頭並不會移動,撞到的同時也會消耗 1 單位的魔力)。接下來這顆石頭將停止移動,若他撞到的是牆壁,或者魔力的總消耗超過107,hh將再也無法驅使他移動;反之魔法能量將會全部傳遞給撞到的石頭,使他移動,並重複著上述的動作。

當石頭已移動了一格以上才撞到障礙,便會發出一個聲響,當產生了至少 x 個聲響時,下一個房間的房門就會出現,此時的石頭仍會繼續移動直到撞到牆壁或hh魔力耗盡,然後hh才會前往下個房間。

以下會告訴你發出聲響與不發出聲響的情況。

因為在撞到另一顆石頭前已經移動1格以上,所以會發出聲響。


因為在撞到牆壁前已經移動1格以上,所以會發出聲響。


因為在撞到另一顆石頭前沒有移動任何一格,所以不發出聲響。


因為在撞到牆壁前沒有移動任何一格,所以不發出聲響。


告訴你 N 與 x ,請你幫助hh選擇石頭該如何放置吧!
Input:
依序會有以下4筆測試資料:

  • N=3, x=2
  • N=5, x=5
  • N=90, x=81000
  • N=100, x=100000

其中第一筆是Sample。
Output:
輸出 N 行,每行 N 個字元,第i行的第j個字元表示該磁磚的狀態,必須剛好是以下五種字元的一種:

  •'^', '<', '>', 或 'v': 表示此磁磚上存在其中的一種石頭。
  •'.': 表示此磁磚上沒有石頭。

然後輸出兩個數字r c (1 ≤ r, c ≤ N),表示hh一開始必須用魔力驅使哪一顆石頭移動,注意,此格必須一定要有石頭。

若有多組解法,輸出任意一組即可。
Sample Input:
3 2
Sample Output:
>vv
^<.
^.<
1 3
HINT:
關於Sample:


sound 0


sound 1


sound 2

接下來會產生無限循環直到總魔力消耗了107才停止,且這些移動不會發出聲響。


最後停止時剛好有兩聲,是一組解喔!
--------------------------------------------------------------------------------------------------------
#include<stdio.h>
char s[105][105];
int main(){
    int n,m,i,j,k,p;
    scanf("%d%d",&n,&m);
    if(n==3){
        puts(">vv\n^<.\n^.<\n1 3");
        return 0;
    }
    if(n==5){
        puts(">...v\nv.<..\n..^..\n>....\n..^.<\n1 1");
        return 0;
    }
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            s[i][j]='.';
    s[0][0]='>';
    for(i=1;i<n;i++)
        s[i][0]='^';
    k=n/2-1;
    if(k%2) k++;
    for(i=0;i<n;i++){
        if(i%2==0){
            s[i][n-1]='v';
            for(j=1;j<n-k-1;j++)
                s[i][j]='>';
            for(j=n-k-1;j<n-1;j+=2)
                s[i][j]='>',s[i][j+1]='.';
        }
        else{
            s[i][1]='v';
            for(j=2;j<1+k+1;j+=2)
                s[i][j]='.',s[i][j+1]='<';
            for(j=1+k+1;j<n;j++)
                s[i][j]='<';
        }
    }
    s[n-1][1]='<';
    for(i=0;i<n;i++){
        for(j=0;j<n;j++)
            putchar(s[i][j]);
        puts("");
    }
    printf("1 1\n");
}

沒有留言:

張貼留言