程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> POJ 2632 Crashing Robots (模擬 坐標調整)(fflush導致RE)

POJ 2632 Crashing Robots (模擬 坐標調整)(fflush導致RE)

編輯:C++入門知識

題目鏈接:http://poj.org/problem?id=2632

先話說昨天順利1Y之後,直到今天下午才再出題 TAT,真是刷題計劃深似海,從此AC是路人- -

本來2632是道稍微惡心點的模擬,但畢竟是模擬,一般模擬都是只要示例過了基本就AC了,但這個題很特殊

我開始的時候一直跑不出測試示例,才發現題目中的插圖和我構想的坐標系是不一樣的(看來還不能輕易忽視掉插圖啊)

\

這個題給出的坐標系是縱軸為y,橫軸為x,y從下到上依次遞增,x軸是從左到右遞增

而我用的二維數組記錄的地圖,也就是說我的縱向是x軸而且從上到下遞增,橫向是y軸,從左到右遞增

在我調了程序近一個小時之後才發現了這個問題。

然後突然懵了,不知道怎麼實現了。突然的全盤否定讓我瞬間沒了思路

過了一段時間我才緩過來,然後打算偷梁換柱

因為這個題目只有在定義機器人的時候才用到了坐標,在指令上沒有用到坐標

然後我就這樣想,在過程處理上依然使用數組那套坐標系,而在錄入保存的時候做些轉換

scanf ("%d%d%s",&x,&y,to);

MAP[B - y][x - 1] = i;
rob[i].x = B - y;
rob[i].y = x - 1;


然後直接不用再管這套坐標系了

後面進展順利,很快代碼成形,調了幾組數據全過,然後一交:RE

然後趕緊看數據范圍,地圖范圍,發現我開的遠遠大於范圍最大值,因為是模擬,又沒有用指針,所以檢查了幾遍代碼,著重檢查數組下標

沒有發現問題,跑了discuss裡給的測試數據,全過,一交還是RE,卡了好久

終於沒有辦法了,只能亂改,直到AC. (= = 亂改居然改AC了)

我改的是把錄入字符改為錄入字符串,只取字符串第一個字符(s[0]),目的是不用控制空格(不過還是RE)

然後因為已經不用空格了,我把我原來控制空格回車符的fflush(stdin)----清空輸入流函數去掉

然後提交AC,至於為什麼fflush導致RE,實在不明白,百度直說了fflush並非庫函數,只是庫函數的補充,部分linux會導致不兼容

雖然不是CE,但不排除是這方面的原因。不過fflush我在處理輸入流的時候經常用,這是第一次出現問題。

fflush導致了RE,也算給自己一次警告吧。

總的來說,這個題也就是一個模擬,雖然麻煩點,但畢竟是個模擬題。

代碼如下:

#include 
#include 
#include 
#include 

struct n
{
    int x,y;
    int to;
}rob[10000];

int MAP[150][150];
int A,B;

int mov (int no,int turn)
{
    int x = rob[no].x,y = rob[no].y;
    int to = rob[no].to;

    //printf ("!1!%d %d\n",x,y);

    MAP[x][y] = -1;
    switch (to)
    {
    case 1:
        if (turn == 1)
        {
            rob[no].to = 4;
            //y--;
        }else if (turn == 2)
        {
            rob[no].to = 2;
            //y++;
        }else if (turn == 3)
        {
            x--;
        }
        break;
    case 2:
        if (turn == 1)
        {
            rob[no].to = 1;
            //x--;
        }else if (turn == 2)
        {
            rob[no].to = 3;
            //x++;
        }else if (turn == 3)
        {
            y++;
        }
        break;
    case 3:
        if (turn == 1)
        {
            rob[no].to = 2;
            //y++;
        }else if (turn == 2)
        {
            rob[no].to = 4;
            //y--;
        }else if (turn == 3)
        {
            x++;
        }
        break;
    case 4:
        if (turn == 1)
        {
            rob[no].to = 3;
            //x++;
        }else if (turn == 2)
        {
            rob[no].to = 1;
            //x--;
        }else if (turn == 3)
        {
            y--;
        }
        break;
    }

    //printf ("!2!%d %d\n",x,y);
    if (x < 0 || y < 0 || x >= B || y >= A)
    {
        printf ("Robot %d crashes into the wall\n",no + 1);
        return 0;
    }

    if (MAP[x][y] != -1)
    {
        printf ("Robot %d crashes into robot %d\n",no + 1,MAP[x][y] + 1);
        return 0;
    }

    rob[no].x = x;
    rob[no].y = y;
    MAP[x][y] = no;
    return 1;
}

int main()
{
    //freopen ("1.txt","w",stdout);
    int N;
    int i,k;
    scanf ("%d",&N);

    while (N--)
    {
        int n,m;
        memset (MAP,-1,sizeof (MAP));
        memset (rob,0,sizeof (rob));
        scanf ("%d%d",&A,&B);
        scanf ("%d%d",&n,&m);

        for (i = 0;i < n;i++)
        {
            int x,y;
            char to[10];

            //fflush (stdin);
            scanf ("%d%d%s",&x,&y,to);

            MAP[B - y][x - 1] = i;
            rob[i].x = B - y;
            rob[i].y = x - 1;

            if (to[0] == 'N')
            {
                rob[i].to = 1;
            }else if (to[0] == 'E')
            {
                rob[i].to = 2;
            }else if (to[0] == 'S')
            {
                rob[i].to = 3;
            }else if (to[0] == 'W')
            {
                rob[i].to = 4;
            }
        }

        int tf = 1;

        for (i = 0;i < m;i++)
        {
            int no,lop,iact;
            char act[10];

            //fflush (stdin);
            scanf ("%d%s%d",&no,act,&lop);

            if (act[0] == 'L')
                iact = 1;
            else if (act[0] == 'R')
                iact = 2;
            else if (act[0] == 'F')
                iact = 3;

                for (k = 0;k < lop;k++)
                    if (tf)
                        tf = mov (no - 1,iact);
        }

        if (tf)
            puts ("OK");
    }

    return 0;
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved