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