题目描述
五虎棋是流传在东北民间的一种游戏,GG小的时候,经常被表哥虐得很惨。
由于各个地区的规则可能不大相同,并且GG的回忆不一定很准,所以,如果规则和你平常玩的的有冲突,请以这里为主。
棋盘是横五条,纵五条直线,形成25个交叉点,双方轮流把棋子放到交叉点上 (由于所需各自和棋子数目不多,才12+13,GG小的时候,用的是象棋的棋盘和棋子,真的用大棋盘很爽~~~)
当双方把棋盘下满之后(先手下了13个棋子,后手下了12个棋子),根据双方摆成的阵型来算分。 (当然,算分之后,还有提掉对方相应个数的棋子,然后棋子一格一格的挪动,继续形成阵型,提掉对方的棋子神码的,GG表述不明白,也就不再后续问题上出题了)
现在GG想让你帮忙算,双方摆成的阵型,分别得分多少?
其中记分的阵型有(用o表示棋子落点)
大五虎(10分)
要求占据了四个角落和最中间的位置
o...o ..... ..o.. ..... o...o
五虎(5分):
摆成形如下图的阵势
o.o .o. o.o
通天(5分):
横着/竖着/斜着 五个棋子连成一条直线,如
..... ..o.. o.... ooooo ..o.. .o... ..... ..o.. ..o.. ..... ..o.. ...o. ..... ..o.. ....o
四斜(4分):
严格定义,GG说不明白,总之只有以下四种
...o. ..... ..... .o... ..o.. o.... ....o ..o.. .o... .o... ...o. ...o. o.... ..o.. ..o.. ....o ..... ...o. .o... .....
三斜(3分):
严格定义,GG说不明白,总之只有以下四种
..o.. ..... ..... ..o.. .o... ..... ..... ...o. o.... o.... ....o ....o ..... .o... ...o. ..... ..... ..o.. ..o.. .....
小斗(1分):
四个棋子形成一个最小正方形
oo oo
例1
o...o .o.o. ..o.. .oooo o..oo
o这名玩家形成了 1个大五虎(10分), 1个小五虎(5分), 2个通天(10分), 1个小斗(1分). 总分:10 + 5 + 10*2 + 1 = 36
例2
.o.o. o.o.o .o.o. o.o.o .o.o.
o这名玩家形成了 4个小五虎, 4个四斜 总分 5*4 + 4*4 = 36
输入
多组测试数据。首先是一个整数T ( 1 ≤ T ≤ 10000 ),占一行,表示测试数据的组数.
对于每组测试数据,占6行。 首先是一个空行 接下来的五行,表示一个局势。 也就是说,每行5个字符(x表示先手, o表示后手,也就是说,会有13个x和12个o)
输出
对于每组测试数据,输出一行. 结果为两个整数,之间用一个空格隔开,分别表示先手(x)的得分,和后手(o)的得分。
样例输入
2 oxxxo xoxox xxoxx xoooo oxxoo xoxox oxoxo xoxox oxoxo xoxox
样例输出
9 26 57 36
1 #include <stdio.h> 2 #include <iostream> 3 using namespace std; 4 char a[10][10]; 5 6 int dafu(char c) 7 { 8 if(a[1][1]==c && a[1][5]==c && a[3][3]==c && a[5][1]==c && a[5][5]==c) return 10; 9 return 0; 10 } 11 int xiaofu(char c) 12 { 13 int t=0; 14 for(int i=1; i<=3; i++) 15 { 16 for(int j=1; j<=3; j++) 17 { 18 if(a[i][j]==c && a[i][j+2]==c && a[i+1][j+1]==c && a[i+2][j]==c && a[i+2][j+2]==c) t+=5; 19 } 20 } 21 return t; 22 } 23 int tongtian(char c) 24 { 25 int t=0; 26 for(int i=1; i<=5; i++) 27 { 28 if(a[i][1]==c && a[i][2]==c && a[i][3]==c && a[i][4]==c && a[i][5]==c) t+=5; 29 if(a[1][i]==c && a[2][i]==c && a[3][i]==c && a[4][i]==c && a[5][i]==c) t+=5; 30 } 31 if(a[1][1]==c && a[2][2]==c && a[3][3]==c && a[4][4]==c && a[5][5]==c) t+=5; 32 if(a[5][1]==c && a[4][2]==c && a[3][3]==c && a[2][4]==c && a[1][5]==c) t+=5; 33 return t; 34 } 35 int sixie(char c) 36 { 37 int t=0; 38 if(a[1][4]==c && a[2][3]==c && a[3][2]==c && a[4][1]==c) t+=4; 39 if(a[2][5]==c && a[3][4]==c && a[4][3]==c && a[5][2]==c) t+=4; 40 if(a[2][1]==c && a[3][2]==c && a[4][3]==c && a[5][4]==c) t+=4; 41 if(a[1][2]==c && a[2][3]==c && a[3][4]==c && a[4][5]==c) t+=4; 42 return t; 43 } 44 int sanxie(char c) 45 { 46 int t=0; 47 if(a[1][3]==c && a[2][2]==c && a[3][1]==c) t+=3; 48 if(a[1][3]==c && a[2][4]==c && a[3][5]==c) t+=3; 49 if(a[3][1]==c && a[4][2]==c && a[5][3]==c) t+=3; 50 if(a[3][5]==c && a[4][4]==c && a[5][3]==c) t+=3; 51 return t; 52 } 53 int xiaodou(char c) 54 { 55 int t=0; 56 for(int i=1; i<=4; i++) 57 { 58 for(int j=1; j<=4; j++) 59 { 60 if(a[i][j]==c && a[i][j+1]==c && a[i+1][j]==c && a[i+1][j+1]==c) t+=1; 61 } 62 } 63 return t; 64 } 65 66 int main() 67 { 68 int t; 69 scanf("%d",&t); 70 getchar(); 71 while(t--) 72 { 73 getchar(); 74 for(int i=1; i<=5; i++) 75 { 76 for(int j=1; j<=5; j++) 77 { 78 scanf("%c",&a[i][j]); 79 } 80 getchar(); 81 } 82 83 84 int s1=0,s2=0; 85 s1+=dafu('x'); 86 s2+=dafu('o'); 87 88 s1+=xiaofu('x'); 89 s2+=xiaofu('o'); 90 91 s1+=tongtian('x'); 92 s2+=tongtian('o'); 93 94 s1+=sixie('x'); 95 s2+=sixie('o'); 96 97 s1+=sanxie('x'); 98 s2+=sanxie('o'); 99 100 s1+=xiaodou('x'); 101 s2+=xiaodou('o'); 102 103 printf("%d %d\n",s1,s2); 104 } 105 106 return 0; 107 }