2016年1月16日 星期六

[HOJ 294][Codeforces #192]The Evil Temple and the Moving Rocks

HOJ生病惹QQ,因此我在這裡做了題目備份,請參考~

總之,這題是各顯神通吧,只要你的方法可以讓石頭碰撞夠多次就OK
我想到的方式是類似下面這樣:

v.<.<.<.<.<<<<<<<
>>>>>>>.>.>.>.>.^
v.<.<.<.<.<<<<<<<
>>>>>>>.>.>.>.>.^
v.<.<.<.<.<<<<<<<
>>>>>>>.>.>.>.>.^
v.<.<.<.<.<<<<<<<
>>>>>>>.>.>.>.>.^
v.<.<.<.<.<<<<<<<
>>>>>>>.>.>.>.>.^
v.<.<.<.<.<<<<<<<
>>>>>>>.>.>.>.>.^
v.<.<.<.<.<<<<<<<
>>>>>>>.>.>.>.>.^


把魔法施在左上角那顆往下的石頭

經過模擬:
N=3時,會發出聲響3次
N=5時,會發出聲響6次
N=90時,會發出聲響81044次
N=100時,會發出聲響108949次


剛好都卡底線XD

code:
#include<cstdio>
char GRID[100][101];
int N,X;
void swap(char &a,char &b){static char c;c=a,a=b,b=c;}
int Simulate(int r,int c)
{
    int ans=0;
    bool click=false;
    for(int counter=10000000;counter--;)
    {
        switch(GRID[r][c])
        {
            case'^':
            {
                if(--r<0)goto do_break;
                if(GRID[r][c]=='.')swap(GRID[r][c],GRID[r+1][c]),click=true;
                else if(click)ans++,click=false;
            }break;
            case'v':
            {
                if(++r>=N)goto do_break;
                if(GRID[r][c]=='.')swap(GRID[r][c],GRID[r-1][c]),click=true;
                else if(click)ans++,click=false;
            }break;
            case'<':
            {
                if(--c<0)goto do_break;
                if(GRID[r][c]=='.')swap(GRID[r][c],GRID[r][c+1]),click=true;
                else if(click)ans++,click=false;
            }break;
            case'>':
            {
                if(++c>=N)goto do_break;
                if(GRID[r][c]=='.')swap(GRID[r][c],GRID[r][c-1]),click=true;
                else if(click)ans++,click=false;
            }break;
        }
    }
    do_break:;
    return ans;
}
int main()
{
//    freopen("out.txt","w",stdout);
    while(scanf("%d%d",&N,&X)==2)
    {
        for(int i=0;i<N;i++)
        {
            for(int j=0;j<N;j++)GRID[i][j]='.';
            GRID[i][N]='\0';
            const int cnt=N/3;
            if(i&1)
            {
                int col=0;
                for(int j=0;j<cnt;j++)GRID[i][col++]='>';
                for(int j=0;j<cnt;j++)GRID[i][col++]='.',GRID[i][col++]='>';
                GRID[i][col-1]='^';
            }
            else
            {
                int col=0;
                for(int j=0;j<cnt;j++)GRID[i][col++]='<',GRID[i][col++]='.';
                for(int j=0;j<cnt;j++)GRID[i][col++]='<';
                GRID[i][0]='v';
            }
        }
//        for(int i=0;i<N;i++)puts(GRID[i]);
//        puts("1 1");
//        printf("%d\n",Simulate(0,0));
        for(int i=0;i<N;i++)puts(GRID[i]);
        puts("1 1");
        break;
    }
    return 0;
}

沒有留言:

張貼留言

歡迎留言或問問題~
若您的留言中包含程式碼,請參考這篇
如果留言不見了請別慌,那是因為被google誤判成垃圾留言,小莫會盡快將其手動還原