Uva 101 – The Blocks Problem//簡單類比

來源:互聯網
上載者:User

分析:這道題蠻有意思的,雖然說很簡單,但是可以當做練手吧,鍛煉自己碼代碼的能力。

注意:當a和b相等的時候,判定這個輸入不合法,不做任何的操作。

#include<stdio.h>#include<string.h>#define MAXN 26int blocks[MAXN][MAXN];int n,order[MAXN],position[MAXN];void init(){    memset(blocks,-1,sizeof(blocks));    for(int i=0;i!=n;i++)    {        order[i]=0;        blocks[i][order[i]]=i;        position[i]=i;    }}void returning_back(int x){    int pos=position[x];    for(int i=order[x]+1;blocks[pos][i]!=-1;i++)    {        blocks[blocks[pos][i]][0]=blocks[pos][i];        position[blocks[pos][i]]=blocks[pos][i];        order[blocks[pos][i]]=0;        blocks[pos][i]=-1;    }}void move_onto(int a,int b){    int pos_a=position[a];    int pos_b=position[b];    if(pos_a==pos_b) return;    returning_back(a);    returning_back(b);    blocks[pos_a][order[a]]=-1;    order[a]=order[b]+1;    blocks[pos_b][order[a]]=a;    position[a]=pos_b;}void move_over(int a,int b){    int pos_a=position[a];    int pos_b=position[b];    if(pos_a==pos_b) return;    returning_back(a);    int i;    blocks[pos_a][order[a]]=-1;    for(i=order[b]+1;blocks[pos_b][i]!=-1;i++);    order[a]=i;    blocks[pos_b][order[a]]=a;    position[a]=pos_b;}void pile_onto(int a,int b){    int pos_a=position[a];    int pos_b=position[b];    if(pos_a==pos_b) return;    returning_back(b);    int i,j=order[b];    for(i=order[a];blocks[pos_a][i]!=-1;i++)    {        order[blocks[pos_a][i]]=j+1;        blocks[pos_b][j+1]=blocks[pos_a][i];        position[blocks[pos_a][i]]=pos_b;        blocks[pos_a][i]=-1;        j++;    }}void pile_over(int a,int b){    int pos_a=position[a];    int pos_b=position[b];    int i,j;    if(pos_a==pos_b) return;    for(i=order[b]+1;blocks[pos_b][i]!=-1;i++);    for(j=order[a];blocks[pos_a][j]!=-1;j++)    {        blocks[pos_b][i]=blocks[pos_a][j];        position[blocks[pos_a][j]]=pos_b;        order[blocks[pos_a][j]]=i;        blocks[pos_a][j]=-1;        i++;    }}int main(){    char s1[5],s2[5];    int a,b;    scanf("%d",&n);    init();    while(scanf("%s",s1)&&s1[0]!='q')    {        scanf("%d%s%d",&a,s2,&b);        if(s1[0]=='m'&&s2[1]=='n') move_onto(a,b);        if(s1[0]=='m'&&s2[1]=='v') move_over(a,b);        if(s1[0]=='p'&&s2[1]=='n') pile_onto(a,b);        if(s1[0]=='p'&&s2[1]=='v') pile_over(a,b);    }    for(int i=0;i!=n;i++)    {        printf("%d:",i);        for(int j=0;blocks[i][j]!=-1;j++) printf(" %d",blocks[i][j]);        printf("\n");    }    return 0;}

貌似還可以在開一個數組,來記錄每個pile當前的blocks的個數,這樣就減少不需要用for迴圈找pile的最上面的那個block了。

這道題對我的意義蠻大的,第一次獨立完成,即使wa了8次也沒有看別人的代碼,而是自己找錯誤的資料。哈哈,keep moving!

zys love sky and shaow!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.