五虎棋
来源:互联网 发布:苹果看书软件 编辑:程序博客网 时间:2024/06/12 00:05
五虎棋是流传在东北民间的一种游戏,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分):
四个棋子形成一个最小正方形
oooo
例1
o...o.o.o...o...ooooo..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)的得分。
样例输入
2oxxxoxoxoxxxoxxxoooooxxooxoxoxoxoxoxoxoxoxoxoxoxox
样例输出
9 2657 36代码如下:
# include <stdio.h>int tongtian(char a[5][5],char n)//此函数为判断通天的分数 {int i,j=0,m=0,num=0;for(j=0;j<5;j++){ for(i=0;i<5;i++) { if(a[i][j]==n){m++;}if(m==5){ num++; m=0; } } m=0; } for(i=0;i<5;i++){ for(j=0;j<5;j++) { if(a[i][j]==n){m++;}if(m==5){ num++; m=0; } } m=0; } j=0; for(i=0;i<5;i++) { if(a[i][j]==n) { j++; m++;}if(m==5){num++;}}m=0;j=4; for(i=0;i<5;i++) { if(a[i][j]==n) { j--; m++;}if(m==5){num++;}}m=0;num=num*5; return num;}int dawuhu(char a[5][5],char n)// 此函数为判断大五虎的分数{int num=0;if(a[0][0]==n&&a[0][4]==n&&a[2][2]==n&&a[4][0]==n&&a[4][4]==n){num=10;}return num;}int wuhu (char a[5][5],char n )// 此函数为判断五虎的分数{int i=1,j=1,num=0;for(i=1;i<=3;i++){for(j=1;j<=3;j++) if(a[i][j]==n&&a[i-1][j-1]==n&&a[i-1][j+1]==n&&a[i+1][j-1]==n&&a[i+1][j+1]==n) { num++; } } num=num*5; return num;}int sixie(char a[5][5],char n)// 此函数为判断四斜的分数{int num=0;if(a[0][3]==n&&a[1][2]==n&&a[2][1]==n&&a[3][0]==n){num++;}if(a[1][0]==n&&a[2][1]==n&&a[3][2]==n&&a[4][3]==n){num++;}if(a[1][4]==n&&a[2][3]==n&&a[3][2]==n&&a[4][1]==n){num++;}if(a[0][1]==n&&a[1][2]==n&&a[2][3]==n&&a[3][4]==n){num++;}num=num*4;return num;}int sanxie(char a[5][5],char n)// 此函数为判断三斜的分数{int num=0;if(a[0][2]==n&&a[1][1]==n&&a[2][0]==n){num++;}if(a[2][4]==n&&a[3][3]==n&&a[4][2]==n){num++;}if(a[2][0]==n&&a[3][1]==n&&a[4][2]==n){num++;}if(a[0][2]==n&&a[1][3]==n&&a[2][4]==n){num++;}num=num*3;return num;}int xiaodou(char a[5][5],char n)// 此函数为判断小斗的分数{int i,j,num=0;for(i=0;i<4;i++){for(j=0;j<4;j++){if(a[i][j]==n&&a[i+1][j]==n&&a[i][j+1]==n&&a[i+1][j+1]==n){num++;}}}return num;}int main(){char a[5][5],n,m;int i,sum1,sum2,w;scanf("%d",&w);while(w--){for(i=0;i<5;i++){scanf("%s",a[i]);}n='o';m='x';sum1=xiaodou(a,m)+sanxie(a,m)+sixie(a,m)+wuhu(a,m)+dawuhu(a,m)+tongtian(a,m);sum2=xiaodou(a,n)+sanxie(a,n)+sixie(a,n)+wuhu(a,n)+dawuhu(a,n)+tongtian(a,n);printf("%d %d\n",sum1,sum2); }return 0;}
- 五虎棋
- ACM--Five Tiger--湘大oj 1173--五虎棋
- MySQL快速入门(二)
- 209. Minimum Size Subarray Sum 【M】【35】
- 37.数组中只出现一次的数字
- (4.1.23.13)自定义控件三部曲之动画篇(十一)——layoutAnimation与gridLayoutAnimation
- 蓝桥杯 算法提高 拿糖果(筛法+动态规划)
- 五虎棋
- 【安卓中的缓存策略系列】安卓缓存策略之磁盘缓存DiskLruCache
- HDU 1241 Oil Deposits
- 随便写写
- [容器]STL之deque容器详解
- linux基本命令(22)——find命令参数详解
- C#学习网站
- UVA - 11997 K Smallest Sums
- Android学习 -- 《关于Activity》