翻翻棋(找規律問題)(FZU Problem 2230) FZU Problem 2230
阿新 • • 發佈:2018-11-09
題目是這樣的:
FZU Problem 2230
象棋翻翻棋(暗棋)中雙方在4*8的格子中交戰,有時候最後會只剩下帥和將。根據暗棋的規則,棋子只能上下左右移動,且相同的級別下,主動移動到地方棋子方將吃掉對方的棋子。將和帥為同一級別。然而勝負在只剩下帥和將的時候已定。
Input
第一行T,表示T組資料。
每組資料共有四行字串,每行字串共八個字元
’#’表示空格
’*’表示紅方帥
’.’表示黑方將
此時紅方先走
每組輸入之間沒有空行。
Output每組資料輸出一行。若為紅方贏輸出Red win,否則輸出 Black win
1 ######.# #####*## ######## ########Sample Output
Black win
剛開始看的時候可能有點蒙圈,別緊張,把棋子放在不同位置找規律,這道題的重點在於橫縱下標的差。
經過嘗試,可以得到,將和帥在同一斜線上時,總是黑勝(從圖上也能看出點眉目);接下來看其餘地方,這裡用【x,xx】表示黑方老大的下標,用【y,yy】表示白方老大的下標,x0=abs(x-y),y0=abs(xx-yy),觀察嘗試可知:
1、x0%2=0&&y0%2==1 時,黑敗
2、x0%2=1&&y0%2==0 時,黑敗
3、x0%2=0&&y0%2==0 時,黑勝
4、x0%2=1&&y0%2==1 時,黑勝
如此令c=x0+y0,則c是偶數時,黑勝,反之黑敗,道理明白了,下面是AC程式碼
1、用scanf版需要用兩個getchar()來吸收回車
#include<cstdio> #include<cstdlib> int main() { int t,x,y,xx,yy; char a[4][8]; scanf("%d",&t); getchar();//吸收回車 while(t--){ for(int i=0;i<4;i++){ for(int j=0;j<8;j++){ scanf("%c",&a[i][j]); if(a[i][j]=='.'){ x=i; xx=j; } if(a[i][j]=='*'){ y=i; yy=j; } } getchar();//吸收回車 } int c=abs(x-y)+abs(xx-yy); if(c%2==0) printf("Black win\n"); else printf("Red win\n"); } return 0; }
2、cin版不用
#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;
int main()
{
int t,x,y,xx,yy;
char a[4][8];
scanf("%d",&t);
while(t--){
for(int i=0;i<4;i++){
for(int j=0;j<8;j++){
cin>>a[i][j];
if(a[i][j]=='.'){
x=i;
xx=j;
}
if(a[i][j]=='*'){
y=i;
yy=j;
}
}
}
int c=abs(x-y)+abs(xx-yy);
if(c%2==0)
printf("Black win\n");
else printf("Red win\n");
}
return 0;
}