1. 程式人生 > >翻翻棋(找規律問題)(FZU Problem 2230) FZU Problem 2230

翻翻棋(找規律問題)(FZU Problem 2230) FZU Problem 2230

題目是這樣的:

FZU Problem 2230

象棋翻翻棋(暗棋)中雙方在4*8的格子中交戰,有時候最後會只剩下帥和將。根據暗棋的規則,棋子只能上下左右移動,且相同的級別下,主動移動到地方棋子方將吃掉對方的棋子。將和帥為同一級別。然而勝負在只剩下帥和將的時候已定。


Input

第一行T,表示T組資料。

每組資料共有四行字串,每行字串共八個字元

’#’表示空格

’*’表示紅方帥

’.’表示黑方將

此時紅方先走

每組輸入之間沒有空行。

Output

每組資料輸出一行。若為紅方贏輸出Red win,否則輸出 Black win

Sample Input
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; 
 }