标签:
题目链接:
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