2013年11月16日 星期六

UVA-1030

UVA-1030 - Image Is Everything


這題在寫得時候真的很煩人
memset不知道為什麼完全沒有作用...
害我原本==1 找了好久才發現根本不會被set成 1 = =

另外就是再處理某一格是否存在方塊時的邏輯:
1. 先把可以看透的行刪掉
2. 檢查是否每一方塊從每一面看都是同一顏色

想起來很容易
但是在實作上有一些難點:
1.
輸入的格式非常的機車
我在處理的時候就沒弄好
導致投影到真實物件上時要做很多轉換 030
2.
因為在檢查一個方塊是否存在時
不知道隔壁的方塊是否真的存在
還是只是還沒踢除而已
所以就給他跑一個while
直到都沒有更新時就可以判定已經檢查完成

因為邊寫邊RC
寫的超冗
結果DEBUG超久= =

寫這麼冗貼出來有點不好意思///

#include<iostream>
#include<stdio.h>
#include<string.h>
bool check(int obj[][10][10], int n, int i, int j, int k, char side[][10][10]){
    char color=1;
    int m,F;
    m=i+1;F=1;
    if(side[3][k][n-j-1]=='.' || side[1][k][j]=='.' || side[0][k][i]=='.' || side[2][k][n-i-1]=='.' || side[5][n-j-1][i]=='.' || side[4][j][i]=='.')
        return false;
    while(F && m>=0 && m<n){    //3
        if(obj[m][j][k]!=0)
            F=0;
        m++;
    }
    if(F){
        color=side[3][k][n-j-1];
    }
    m=i-1;F=1;
    while(F && m>=0 && m<n){    //1
        if(obj[m][j][k]!=0)
            F=0;
        m--;
    }
    if(F){
        if(color==1)
            color=side[1][k][j];
        else if(color!=side[1][k][j])
            return false;
    }
    m=j+1;F=1;
    while(F && m>=0 && m<n){    //0
        if(obj[i][m][k]!=0)
            F=0;
        m++;
    }
    if(F){
        if(color==1)
            color=side[0][k][i];
        else if(color!=side[0][k][i])
            return false;
    }
    m=j-1;F=1;
    while(F && m>=0 && m<n){    //2
        if(obj[i][m][k]!=0)
            F=0;
        m--;
    }
    if(F){
        if(color==1)
            color=side[2][k][n-i-1];
        else if(color!=side[2][k][n-i-1])
            return false;
    }
    m=k+1;F=1;
    while(F && m>=0 && m<n){    //5
        if(obj[i][j][m]!=0)
            F=0;
        m++;
    }
    if(F){
        if(color==1)
            color=side[5][n-j-1][i];
        else if(color!=side[5][n-j-1][i])
            return false;
    }
    m=k-1;F=1;
    while(F && m>=0 && m<n){    //4
        if(obj[i][j][m]!=0)
            F=0;
        m--;
    }
    if(F){
        if(color==1)
            color=side[4][j][i];
        else if(color!=side[4][j][i])
            return false;
    }
    return true;
}

int main(){
    int ans;
    int obj[10][10][10];
    char side[6][10][10];  //F L BA R T BU
    memset(obj,1,4*10*10*10);
    int n;
    while(scanf("%d",&n)==1 && n!=0){
        ans=0;
        memset(obj,1,4*10*10*10);
        for(int i=0 ; i<n ; i++)
            for(int j=0 ; j<6 ; j++)
                for(int k=0 ; k<n ; k++)
                    scanf(" %c",&side[j][i][k]);
        int FINE=1;
        while(FINE){
            FINE=0;
            for(int i=0 ; i<n ; i++)
                for(int j=0 ; j<n ; j++)
                    for(int k=0 ; k<n ; k++)
                        if(obj[i][j][k]!=0)
                            if(!check(obj, n, i, j, k,side)){
                                obj[i][j][k]=0;
                                FINE=1;
                            }

        }
        for(int i=0 ; i<n ; i++)
            for(int j=0 ; j<n ; j++)
                for(int k=0 ; k<n ; k++)
                    if(obj[i][j][k]!=0)
                        ans+=1;
        printf("Maximum weight: %d gram(s)\n",ans);
    }
return 0;
}


寫程式絕對要專心><

沒有留言:

張貼留言

TEST