码迷,mamicode.com
首页 > 其他好文 > 详细

poj 2996 Help Me with the Game 模拟

时间:2014-12-21 17:58:37      阅读:319      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

  http://poj.org/problem?id=2996

题目描述:

  输入一个棋盘, white player的棋子用大写字母表示,black player‘s的棋子用小写字母表示,两方都有‘k’,‘q’,‘r’,‘b’,‘n’,‘p’这些棋子,棋盘由‘+’,‘-’,‘|’构成,黑色区域的空白用‘:’填充,白色区域的空白用‘.‘填充,统计双方的棋子,棋子按照‘k’,‘q’,‘r’,‘b’,‘n’,‘p’的顺序输出。相同棋子内部的排序,如果在同一行按照列的升序排,否则白棋按照行升序排,黑按照行降序排。

详细的输出格式:技术分享(我发誓:这个绝对是我目前见到的最别扭的模拟~~)。

解题思路:

  我用的是打标和模拟,有一点需要注意的是,给的棋牌最下面的一行才是第一行,所以要倒着输入才对。

代码:

  

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <algorithm>
 5 #include <iostream>
 6 using namespace std;
 7 #define maxn 70
 8 
 9 char dir[2][6]= {K,Q,R,B,N,P, k,q,r,b,n,p};//打标,在统计棋子个数和输出的时候用
10 struct node//由于储存棋子位置
11 {
12     int x, y;
13 };
14 int cmp (const void *a, const void *b)//由于遍历方式,不满足黑棋的排序方式,手动写快排,对黑棋进行排序;
15 {
16     node *c = (node *)a;
17     node *d = (node *)b;
18     if (c->x == d->x)
19         return c->y - d->y;
20     return d->x - c->x;
21 }//
22 int main ()
23 {
24     int i, j, k, l, a[2][10], n;//a[颜色][种类]数组用于储存对应类型棋子的个数
25     char str[maxn], map[10][10];
26     node dp[2][6][maxn];//dp[颜色][种类][个数]
27     memset (map, 0, sizeof(map));
28     memset (a[2], 0, sizeof(a[2]));
29     scanf ("%s", str);
30     for (i=8; i>0; i--)//翻转棋盘,并且把棋子抄到map中
31     {
32         scanf ("%s", str);
33         for (j=1, k=2; j<=8; k+=4, j++)
34             map[i][j] = str[k];
35         scanf ("%s", str);
36     }
37     memset (a, 0, sizeof(a));//统计不同棋子的数目
38     for (i=1; i<9; i++)
39         for (j=1; j<9; j++)
40             for (k=0; k<2; k++)
41                 for (l=0; l<6; l++)
42                     if (map[i][j] == dir[k][l])
43                     {
44                         dp[k][l][a[k][l]].x = i;
45                         dp[k][l][a[k][l] ++].y = j;
46                     }
47 
48 
49     for (k=0; k<2; k++)//输出对棋子的统计结果
50     {
51         int flag = 0;
52         if (k == 0)
53             printf ("White: ");
54         else
55             printf ("Black: ");
56         for (i=0; i<6; i++)
57         {
58             if (k == 1)
59                 qsort (dp[k][i], a[k][i], sizeof(dp[k][i][0]), cmp);
60             for (j=0; j<a[k][i]; j++)
61             {
62                 if (flag != 0)
63                     printf (",");
64                 if (i != 5)
65                     printf ("%c", dir[0][i]);
66                 printf ("%c%d", dp[k][i][j].y+a-1, dp[k][i][j].x);
67             flag = 1;
68             }
69         }
70         printf ("\n");
71     }
72     return 0;
73 }

 

poj 2996 Help Me with the Game 模拟

标签:

原文地址:http://www.cnblogs.com/alihenaixiao/p/4176805.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!