POJ 2996 Help Me with the Game (模拟)

题目链接:http://poj.org/problem?id=2996

POJ训练计划中的模拟都是很棒的模拟,也很有代表性。

这个题讲的是给你一个国际象棋棋盘,写程序打印出黑白双方的棋子,以及棋子的坐标。

但是需要注意的国际棋盘的坐标问题

如下图这个国际棋盘

可以看到数字轴和字母轴的方向以及增减关系。

所以在这个题的统计的时候需要进行坐标转换,因为已经做过类似的方法了,这个也不是问题。

 

总之就是个模拟,代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

struct node
{
    char x,y;
}zb[10000];

char MAP[20][40];

int cmp (const void * a,const void * b)
{
    struct node *ta = (struct node *)a;
    struct node *tb = (struct node *)b;

    if (ta->y == tb->y)
        return ta->x - tb->x;

    return ta->y - tb->y;
}

int cmp1 (const void * a,const void * b)
{
    struct node *ta = (struct node *)a;
    struct node *tb = (struct node *)b;

    if (ta->y == tb->y)
        return ta->x - tb->x;

    return tb->y - ta->y;
}

int fin(char c)
{
    int i,k;
    int s = 0;
    int x = 0,y = 0;;
    for (i = 1,y = 0;i < 17;y++,i += 2)
    {
        for (k = 2,x = 0;k < 33;x++,k += 4)
            if (MAP[i][k] == c)
            {
                zb[s].x = x;
                zb[s++].y = 8 - y;
                //printf ("!%d - %d!\n",x,8 - y);
            }
    }

    return s;
}

int main()
{
    int i,k;
    int n;
    for (i = 0;i < 17;i++)
        scanf ("%s",MAP[i]);

    printf ("White: ");

    n = fin('K');
    qsort (zb,n,sizeof (zb[0]),cmp);
    for (i = 0;i < n;i++)
        printf ("K%c%d,",zb[i].x + 'a',zb[i].y);

    n = fin('Q');
    qsort (zb,n,sizeof (zb[0]),cmp);
    for (i = 0;i < n;i++)
        printf ("Q%c%d,",zb[i].x + 'a',zb[i].y);

    n = fin('R');
    qsort (zb,n,sizeof (zb[0]),cmp);
    for (i = 0;i < n;i++)
        printf ("R%c%d,",zb[i].x + 'a',zb[i].y);

    n = fin('B');
    qsort (zb,n,sizeof (zb[0]),cmp);
    for (i = 0;i < n;i++)
        printf ("B%c%d,",zb[i].x + 'a',zb[i].y);

    n = fin('N');
    qsort (zb,n,sizeof (zb[0]),cmp);
    for (i = 0;i < n;i++)
        printf ("N%c%d,",zb[i].x + 'a',zb[i].y);

    n = fin('P');
    qsort (zb,n,sizeof (zb[0]),cmp);
    for (i = 0;i < n;i++)
    {
        printf ("%c%d",zb[i].x + 'a',zb[i].y);

        if (i < n - 1)
            printf(",");
        else
            printf ("\n");
    }

    printf ("Black: ");

    n = fin('k');
    qsort (zb,n,sizeof (zb[0]),cmp1);
    for (i = 0;i < n;i++)
        printf ("K%c%d,",zb[i].x + 'a',zb[i].y);

    n = fin('q');
    qsort (zb,n,sizeof (zb[0]),cmp1);
    for (i = 0;i < n;i++)
        printf ("Q%c%d,",zb[i].x + 'a',zb[i].y);

    n = fin('r');
    qsort (zb,n,sizeof (zb[0]),cmp1);
    for (i = 0;i < n;i++)
        printf ("R%c%d,",zb[i].x + 'a',zb[i].y);

    n = fin('b');
    qsort (zb,n,sizeof (zb[0]),cmp1);
    for (i = 0;i < n;i++)
        printf ("B%c%d,",zb[i].x + 'a',zb[i].y);

    n = fin('n');
    qsort (zb,n,sizeof (zb[0]),cmp1);
    for (i = 0;i < n;i++)
        printf ("N%c%d,",zb[i].x + 'a',zb[i].y);

    n = fin('p');
    qsort (zb,n,sizeof (zb[0]),cmp1);
    for (i = 0;i < n;i++)
    {
        printf ("%c%d",zb[i].x + 'a',zb[i].y);

        if (i < n - 1)
            printf(",");
        else
            printf ("\n");
    }

    return 0;
}


 

我的博客:http://blog.csdn.net/codehypo

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值