ACM Q101 陣列函數、ANSI

By
Advertisement
http://www3.tcgs.tc.edu.tw/~sagit/luckycat/q101.htm

luckycat中被列為是兩顆星的難度
我的認知是程式撰寫本身一顆星;題目理解邏輯釐清大概三顆星
所以平均下來兩顆星無誤!
此題被列為simulation向,
解題時除非是天資聰穎,不然還是如我一般,土法煉鋼地拿出一張紙,一步一步邊畫邊思考吧!

記錄一:
  意外地發現原來函數在傳遞陣列的時候,傳遞至函數的並不是一整個陣列,而是傳遞存放陣列的記憶體位址!
  原本要在陣列前加&傳遞,後來發現不用加就自動耶!傳遞陣列好像就是直接call by pointer...

紀錄二:
  自討苦吃的在宣告模擬的二微陣列時,宣告成了char型態
  因此在設定初始值的時候要把數字0~N填入陣列好像有一點麻煩
  異想天開死地發現可以用ANSI的方式從48+0~48+n的方式把值填入

後記:
  工作上在維運修改其他的程式的時候,常常有這種不能修改原始宣告的情況
  因為程式最初不是由自己開發的,尤其是大型系統更是好多年來不斷地修改下來的成果
  有時候只能一直去想一些偏門的方法來透過最小的修改方法來達成目的...
  唉...當然就長遠來看,這也是造成一個系統不斷肥大的問題之一
  不過我目前還只是一個小螺絲,說實在話的也不能做什麼
  如果想出各種奇怪的方法來解決問題實在是很令人感到開心
  這也變成我在做ACM的目的
  阿不就好棒棒~~

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

#define ILLEGAL -1
#define LEGAL   0

int Q101();
void insertArray(int n, char array[][n]);
void printArray(int n, char array[][n]);
void printRow(int n, char row[n]);

int checklegal(int n, char a[][n], int x, int y);
void pileArray(int n, char a[][n], char act[], int x, char row[]);
void moveArray(int n, char a[][n], char anr[], int x, char row[]);
void overArray(int n, char a[][n], char act[], int y, char row[]);
void ontoArray(int n, char a[][n], char acr[], int y, char row[]);

int Q101() {
        printf("Q101 : **\n");

        int     st=0;
        int     n;
        int     x, y;
        char    c1[14+1], act1[4], act2[4];

        gets(c1);
        sscanf(c1, "%d", &n);
        char    array[n][n];
        insertArray(n, array);
        char    row[n];
        memset(row, 0x00, sizeof(char[n]));

        while(1) {
                gets(c1);
                if ( !strcmp(c1, "quit") )
                        break;
                else {
                        sscanf(c1, "%s %d %s %d", &act1, &x, &act2, &y);
                        if ( checklegal(n, array, x, y) != LEGAL )
                                continue;
                        if ( !strcmp(act1, "pile") )
                                pileArray(n, array, act1, x, row);
                        else if ( !strcmp(act1, "move") )
                                moveArray(n, array, act1, x, row);
                        if ( !strcmp(act2, "over") )
                                overArray(n, array, act2, y, row);
                        else if ( !strcmp(act2, "onto") )
                                ontoArray(n, array, act2, y, row);
                }
        }

        printArray(n, array);
}

void ontoArray(n, array, act, y, row)
int     n, y;
char    array[n][n], act[4], row[n];
{
        int     i, j, cnt;
        int     flag=0;
        char    set[0];
        sprintf(set, "%d", y);

        for ( i=0; i<n; i++ ) {
                for ( j=0; j<n; j++ ) {
                        if ( array[i][j] == set[0] ) {
                                flag=1;
                                break;
                        }
                }
                if ( flag ) break;
        }
        printf("Onto Location: [%d][%d]\n", i, j);

        int     a=i, b=j, offset;

        for ( b++; array[a][b]!='\0'; b++ ) {
                for ( offset=0; offset<n; offset++ ) {
                        if ( array[a][b] == 48+offset ) {
                                array[offset][0] = 48+offset;
                                array[a][b]='\0';
                        }
                }
        }

        for ( j++, cnt=0; j<n; j++, cnt++ ) {
                array[i][j] = row[cnt];
        }

}

void overArray(n, array, act, y, row)
int     n, y;
char    array[n][n], act[4], row[n];
{
        int     i, j, cnt;
        int     flag=0;
        char    set[0];
        sprintf(set, "%d", y);

        for ( i=0; i<n; i++ ) {
                for ( j=0; j<n; j++ ) {
                        if ( array[i][j] == set[0] ) {
                                flag=1;
                                break;
                        }
                }
                if ( flag ) break;
        }
        for ( j; j<n; j++ ) {
                if ( array[i][j] == '\0' )
                break;
        }
        printf("Over Location: [%d][%d]\n", i, j);

        for ( cnt=0; row[cnt]!='\0'; cnt++, j++ ) {
                array[i][j] = row[cnt];
        }
}

void moveArray(n, array, act, x, row)
int     n, x;
char    array[n][n], act[4], row[n];
{
        int     i, j, cnt;
        int     flag=0;
        memset(row, 0x00, sizeof(char[n]));
        char    set[0];
        sprintf(set, "%d", x);

        for ( i=0; i<n; i++ ) {
                for ( j=0; j<n; j++ ) {
                        if ( array[i][j] == set[0] ) {
                                flag=1;
                                break;
                        }
                }
                if ( flag ) break;
        }
        printf("Move Location: [%d][%d]\n", i, j);

        row[0] = array[i][j];
        array[i][j] = '\0';

        int     a=i, b=j, offset;

        for ( b++; array[a][b]!='\0'; b++ ) {
                for ( offset=0; offset<n; offset++ ) {
                        if ( array[a][b] == 48+offset ) {
                                array[offset][0] = 48+offset;
                                array[a][b]='\0';
                        }
                }
        }

}

void pileArray(n, array, act, x, row)
int     n, x;
char    array[n][n], act[4], row[n];
{
        int     i, j, cnt;
        int     flag=0;
        memset(row, 0x00, sizeof(char[n]));
        char    set[0];
        sprintf(set, "%d", x);

        for ( i=0; i<n; i++ ) {
                for ( j=0; j<n; j++ ) {
                        if ( array[i][j] == set[0] ) {
                                flag=1;
                                break;
                        }
                }
                if ( flag ) break;
        }
        printf("Pile Location: [%d][%d]\n", i, j);

        for ( j=j, cnt=0; j<n; j++, cnt++ ) {
                row[cnt] = array[i][j];
                array[i][j] = '\0';
        }
}

int checklegal(n, array, x, y)
int     n;
char    array[n][n];
{
        int     i, j, flag;
        char    setx[0];
        sprintf(setx, "%d", x);
        char    sety[0];
        sprintf(sety, "%d", y);

        for ( i=0; i<n; i++ ) {
                flag=0;
                for ( j=0; j<n; j++ ) {
                        if ( array[i][j] == setx[0] )
                                flag++;
                        if ( array[i][j] == sety[0] )
                                flag++;
                }
                if ( flag == 2 )
                        return ILLEGAL;
        }
        return LEGAL;
}

void printArray(int n, char array[][n])
{
        int i, j;
        for ( i=0; i<n; i++ ) {
                for ( j=0; j<n; j++ ) {
                        if ( array[i][j] == '\0' )
                                printf("[ ]", array[i][j]);
                        else
                                printf("[%c]", array[i][j]);
                }
                printf("\n");
        }
}
void printRow(int n, char row[n])
{
        int i;
        for ( i=0; i<n; i++ ) {
                printf("[%c]", row[i]);
        }
        printf("\n");
}

void insertArray(n, array)
int     n;
char    array[n][n];
{
        int i, j;
        memset(array, 0x00, sizeof(char[n][n]));
        for ( i=0; i<n; i++ ) {
                array[i][0] = 48+i;     //ANSI : char[0] = ANSI[48];
        }
}

0 意見:

張貼留言

技術提供:Blogger.

Latest Photos

Join the Team

Blogger news

Popular Posts