1. 程式人生 > >uva1589象棋 紫書習題4-1

uva1589象棋 紫書習題4-1

uva1589象棋 紫書習題4-1

看到這題 自己的思路是寫個各個子的判斷函式,判斷將軍在不在殺傷範圍內 然後列舉將軍走動的最多四種情況,然後判斷有沒有生存下來的情況。

可是馬 車 炮 將四個子的判斷函式都和全域性所有子的位置有關,需要開一個二維陣列來儲存棋盤資訊。
由於迴圈的程式碼太多了 break不過來了 於是用了goto 可能不太直觀。用1代表alive活著,用0代表died死了。

第一次debug 發現自己用scanf中的%c讀取字元會讀到空格,讀不到想要的結果,改成%s讀取字母g r h c再將s[0]賦值給字元。然後發現輸出為空的情況解除,能正確輸出yes和no但答案不正確。

第二次debug,發現自己有一個if語句中的 比較運算子== 寫成了賦值運算子 = 導致了結果的出錯。更改後,程式無法輸出yes,但no為正確的。

第三次debug,發現原因是因為我的思路是如果四個將軍的位置都為0 died,則輸出yes 將死,可第四個將軍的位置可能在九宮格外不合法,被跳過,就沒輸出yes。增加了一個else語句,確保能輸出yes。

至此 樣例輸入已經通過,開始提交oj。

呃 wa了 ,哪裡出了問題呢?通過oj的debug板塊找別的樣例輸入吧,但是比賽場上,就只能自己苦想了。 通過對比發現,錯誤是因為我的Yes和No只有首字母大寫了 而輸出要求全部大寫。

然後 就ac啦!!! 耗時兩個小時 九點到十一點 邊寫部落格邊寫題的。
自己還不會什麼演算法,應該說完全不會演算法,只能跟著紫書先把語言特性學了,再去攻演算法吧。希望自己有機會能參加寒假學校的acm集訓。我這個大學開學才入門的菜雞,也想和那些高中競賽黨競爭呀。

然後由於 自身水平有限 寫出來的程式碼又長 又基礎(實在只會用基礎語言解題呀)
附上程式碼

#include<stdio.h>
#include<string.h>
int position[12][12],bgx,bgy;
//帥的判斷函式
int g(int i,int j,int x1,int y1)
{
    if(j!=y1)return 1;
    if(j==y1){for (int i1=x1+1;i1<i;i1++){if(position[i1][j])return 1;}}
    return 0;
}
//車的判斷函式
int r(int i,int j,int x1,int y1)
{
    if(j!=y1&&i!=x1)return 1;
    if(j==y1&&i==x1)return 1;
    if(j==y1){if(i>x1){i=i^x1;x1=i^x1;i=i^x1;}for (int i1=i+1;i1<x1;i1++){if(position[i1][j])return 1;}}
    if(i==x1){if(j>y1){j=j^y1;y1=j^y1;j=j^y1;}for (int j1=j+1;j1<y1;j1++){if(position[i][j1])return 1;}}
    return 0;
}
//馬的判斷函式
int h(int i,int j,int x1,int y1)
{
    if(!position[i-1][j]){if(i-2==x1&&j-1==y1){return 0;}if(i-2==x1&&j+1==y1){return 0;}}
    if(!position[i+1][j]){if(i+2==x1&&j-1==y1){return 0;}if(i+2==x1&&j-1==y1){return 0;}}
    if(!position[i][j-1]){if(i-1==x1&&j-2==y1){return 0;}if(i+1==x1&&j-2==y1){return 0;}}
    if(!position[i][j+1]){if(i-1==x1&&j+2==y1){return 0;}if(i+1==x1&&j+2==y1){return 0;}}
    return 1;
}
//炮的判斷函式
int c(int i,int j,int x1,int y1)
{
    int countt=0;
    if(j!=y1&&i!=x1)return 1;
    if(j==y1&&i==x1)return 1;
    if(j==y1){if(i>x1){i=i^x1;x1=i^x1;i=i^x1;}for (int i1=i+1;i1<x1;i1++){if(position[i1][j])countt++;}if(countt==1)return 0;}
    if(i==x1){if(j>y1){j=j^y1;y1=j^y1;j=j^y1;}for (int j1=j+1;j1<y1;j1++){if(position[i][j1])countt++;}if(countt==1) return 0;}
    return 1;
}
//主函式 
int main()
{
//    freopen("input.txt","r",stdin);freopen("output.txt","w",stdout);
    int n;
    next:
    while(scanf("%d%d%d",&n,&bgx,&bgy)==3&&n)
    {
        memset(position,0,sizeof(position));
        int totalresult=0;

        for(int i=0;i<n;i++)
        {
            int zi,x,y;
            char s[2];
            scanf("%s%d%d",&s,&x,&y);zi=s[0];
            position[x][y]=zi;

        }
           if(bgx-1>0){int x1=bgx-1;int y1=bgy;int result=0;
                for (int i=0;i<12;i++)
                {
                    for(int j=0;j<12;j++)
                    {
                        if(position[i][j])
                        {
                            if(position[i][j]=='G'){result=g(i,j,x1,y1);}
                            else if(position[i][j]=='R'){result=r(i,j,x1,y1);}
                            else if(position[i][j]=='H'){result=h(i,j,x1,y1);}
                            else if(position[i][j]=='C'){result=c(i,j,x1,y1);}
                            if(result==0){goto label1;}

                        }
                        if(i==11&&j==11){printf("NO\n");goto next;}
                    }
                }
           }
           label1:if(bgx+1<4){int x1=bgx+1;int y1=bgy;int result=0;
                for (int i=0;i<12;i++)
                {
                    for(int j=0;j<12;j++)
                    {
                        if(position[i][j])
                        {
                            if(position[i][j]=='G'){result=g(i,j,x1,y1);}
                            else if(position[i][j]=='R'){result=r(i,j,x1,y1);}
                            else if(position[i][j]=='H'){result=h(i,j,x1,y1);}
                            else if(position[i][j]=='C'){result=c(i,j,x1,y1);}
                            if(result==0){goto label2;}
                            }
                            if(i==11&&j==11){printf("NO\n");goto next;}
                    }
                }
           }
           label2:if(bgy+1<7){int x1=bgx;int y1=bgy+1;int result=0;
                for (int i=0;i<12;i++)
                {
                    for(int j=0;j<12;j++)
                    {
                        if(position[i][j])
                        {
                            if(position[i][j]=='G'){result=g(i,j,x1,y1);}
                            else if(position[i][j]=='R'){result=r(i,j,x1,y1);}
                            else if(position[i][j]=='H'){result=h(i,j,x1,y1);}
                            else if(position[i][j]=='C'){result=c(i,j,x1,y1);}
                            if(result==0){goto label3;}
                            }
                            if(i==11&&j==11){printf("NO\n");goto next;}
                    }
                }
           }
           label3:if(bgy-1>3){int x1=bgx;int y1=bgy-1;int result=0;
                for (int i=0;i<12;i++)
                {
                    for(int j=0;j<12;j++)
                    {
                        if(position[i][j])
                        {
                            if(position[i][j]=='G'){result=g(i,j,x1,y1);}
                            else if(position[i][j]=='R'){result=r(i,j,x1,y1);}
                            else if(position[i][j]=='H'){result=h(i,j,x1,y1);}
                            else if(position[i][j]=='C'){result=c(i,j,x1,y1);}
                            if(result==0){printf("YES\n");goto next;}
                            }
                            if(i==11&&j==11){printf("NO\n");goto next;}
                        }

                }
           }else {printf("YES\n");goto next;}
    }
    return 0;
}

其實還有很多能優化的地方,加快運算速度,拋去不必要的計算。但由於這題並不考察演算法,既然過了,就不優化了。
預祝自己能堅持學習下去吧。