2014年7月3日 星期四

uva 11040 Add bricks in the wall

從最底層開始建起,當最底層的數字都是正確的時候,上面的一定可以符合。

一開始,最底層的 blank brick 先填 0,然後開始往上建。

當往上遇到 input 給定的 brick時 :

check 是否符合,如果不符合,則調整目前層數的下一層,使符合,並在這一層往上建完後

(調整完這層所要調整的),再從最底層開始建起,這樣的話,剛剛往下調整的層數,由下下層

做 check 時,可以繼續往下調整,


往上建的時候,注意 index:

input 給定的 brick 會和目前往上建的左 brick 的 column 相同,row - 1

往下被調整的 brick 會是目前往上建的左 brick 的 column + 1,row + 1


最後:

當需要調整時,要把 i 設為 10,因為 outer for loop 完成一次時,會做 -1 的動作。


#include <stdio.h>
#include <stdlib.h>

int main(void){
    int amount,i,j,modify,k,m;
    int triangle[10][10]={0};

    scanf("%d",&amount);
    while(amount--){
        for(i=1;i<=9;i+=2){
            for(j=1;j<=i;j+=2){
                scanf("%d",&triangle[i][j]);
            }
        }

        for(i=9;i>1;i--){
            modify=0;
            for(j=1;j<i;j++){
                if( (i-1)%2!=0 && j%2!=0 ){
                    if(triangle[i][j]+triangle[i][j+1]!=triangle[i-1][j]){
                        triangle[i+1][j+1]+=(triangle[i-1][j]-(triangle[i][j]+triangle[i][j+1]))/2;
                        modify=1;
                    }
                }else{
                    triangle[i-1][j]=triangle[i][j]+triangle[i][j+1];
                }
            }

            if(modify==1) i=10;
        }

        for(i=1;i<=9;i++){
            for(j=1;j<i;j++){
                printf("%d ",triangle[i][j]);
                triangle[i][j]=0;
            }
            printf("%d\n",triangle[i][j]);
            triangle[i][j]=0;
        }
    }


    return 0;
}

沒有留言:

張貼留言