翻翻棋(找规律问题)(FZU Problem 2230) FZU Problem 2230

版权声明:本文为博主原创文章,转载需注明出处。 https://blog.csdn.net/zz_Caleb/article/details/80617329

题目是这样的:

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

猜你喜欢

转载自blog.csdn.net/zz_Caleb/article/details/80617329
今日推荐