XTUOJ 1173 Five Tiger(模拟)



Five Tiger

Accepted : 34   Submit : 107
Time Limit : 1000 MS   Memory Limit : 65536 KB

题目描述

五虎棋是流传在东北民间的一种游戏,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


Source

XTU OnlineJudge

   


今天ac的第二个题,也是模拟的题,思路不是很复杂,按照题意来,把函数一个个写出来就行了,主要是输入输出的时候有点坑爹啊(字符串的输入啊!!细节还是处理的不好)在寝室自己用c语言写的时候输入就出现问题了!!按照思路写还是一下子就写出来了,今天也就是这个题目搞了好久,还好最终还是ac啦。

 下面是ac的代码:

#include <stdio.h>
#include <iostream>
using namespace std;
char Matrix[5][5];
using namespace std;
int big_tiger(char ch)//大五虎的情况 10分
{
    if(Matrix[0][0]==ch && Matrix[0][4]==ch && Matrix[2][2]==ch && Matrix[4][0]==ch && Matrix[4][4]==ch)
        return 10;
    else
        return 0;
}
int small_tiger(char ch)//小五虎的情况 5分
{
    int total = 0;
    int i=1,j=1;
    for(i=1; i<4; i++)
        for(j=1; j<4; j++)
        {
            if(Matrix[i][j]==ch && Matrix[i-1][j-1]==ch && Matrix[i+1][j+1]==ch && Matrix[i-1][j+1]==ch && Matrix[i+1][j-1]==ch)
               total += 5;
        }
    return total;
}
int sky(char ch)//通天的情况 5分
{
    int total = 0;
    int i;
    for(i=0; i<5; i++)
    {
        if(Matrix[i][0]==ch && Matrix[i][1]==ch && Matrix[i][2]==ch && Matrix[i][3]==ch && Matrix[i][4]==ch)
            total += 5;
        if(Matrix[0][i]==ch && Matrix[1][i]==ch && Matrix[2][i]==ch && Matrix[3][i]==ch && Matrix[4][i]==ch)
           total += 5;
    }
    if(Matrix[0][0]==ch && Matrix[1][1]==ch && Matrix[2][2]==ch && Matrix[3][3]==ch && Matrix[4][4]==ch)
      total+=5;
    if(Matrix[0][4]==ch && Matrix[1][3]==ch && Matrix[2][2]==ch && Matrix[3][1]==ch && Matrix[4][0]==ch)
      total+=5;
    return total;
}
int four(char ch)//四斜的情况 4分
{
    int total=0;
    if(Matrix[0][3]==ch && Matrix[1][2]==ch && Matrix[2][1]==ch && Matrix[3][0]==ch)
        total += 4;
    if(Matrix[1][0]==ch && Matrix[2][1]==ch && Matrix[3][2]==ch && Matrix[4][3]==ch)
        total += 4;
    if(Matrix[1][4]==ch && Matrix[2][3]==ch && Matrix[3][2]==ch && Matrix[4][1]==ch)
        total += 4;
    if(Matrix[0][1]==ch && Matrix[1][2]==ch && Matrix[2][3]==ch && Matrix[3][4]==ch)
        total += 4;

        return total;
}
int three(char ch)// 三斜的情况 3分
{
    int total=0;
    if(Matrix[0][2]==ch && Matrix[1][1]==ch && Matrix[2][0]==ch)
        total += 3;
    if(Matrix[2][0]==ch && Matrix[3][1]==ch && Matrix[4][2]==ch)
        total += 3;
    if(Matrix[2][4]==ch && Matrix[3][3]==ch && Matrix[4][2]==ch)
        total += 3;
    if(Matrix[0][2]==ch && Matrix[1][3]==ch && Matrix[2][4]==ch)
        total += 3;

    return total;
}
int small_dou(char ch)// 小斗的情况 1分
{
    int total = 0;
    int i,j;
    for(i=0; i<4; i++)
        for(j=0; j<4; j++)
            if(Matrix[i][j]==ch && Matrix[i+1][j]==ch && Matrix[i][j+1]==ch && Matrix[i+1][j+1]==ch)
            {
                total++;
            }

    return total;

}
int main()
{
    int t,frist,last ,i,j;
    scanf("%d",&t);
    getchar();//吸收我们输入时输进去的空格;
    //cin>>t;//这里我先前就用输入流和c语言的输入进行对比,这里用cin就方便多了,就不用在考虑这种情况了,这里要吸收教训!!
    while(t--)
    {
        getchar();//题目要求要空一行
        for(i=0;i<5;i++)
            {
               for(j=0;j<5;j++)
               scanf("%c",&Matrix[i][j]);
               getchar();//吸收我们的换行符
               //cin>>Matrix[i][j];
            }
         frist=last=0;
         frist=big_tiger('x')+small_tiger('x')+sky('x')+four('x')+three('x')+small_dou('x');
         last=big_tiger('o')+small_tiger('o')+sky('o')+four('o')+three('o')+small_dou('o');
         printf("%d %d\n",frist,last);
    }
    return 0;
}
只ac了几个简单题,看网上的大神说自己的经历的时候,都差不多都做了7.8百道题,任重而道远啊!!!



你可能感兴趣的:(算法,ACM)