2019 GDUT RC 3 Problem C(题解)

原题

2019 GDUT RC 3 Problem C(题解)

2019 GDUT RC 3 Problem C(题解)

题目大意

题目背景是给一个九宫格棋局,棋局里面的相同字母表示同一头牛下的棋,让你判断有多少头牛是个体赢的,有多少头牛组队赢的,组队赢的是指若同一行是xxo,这时候o和x组队他们就占据了一行,即赢.组队只能两头牛之间组.

题目分析

有题意可知,只需要扫一下所有胜利情况即可,不过需要注意的是如果是同一头牛或同一组牛取得的胜利不能叠加.例如牛a已经赢了一次了,后面又扫到牛a赢了,这时候ans不能再+1.

代码

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <iostream>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <vector>
 7 #include <string>
 8 #include <utility>
 9 #include <queue>
10 #include <stack>
11 const int INF=0x3f3f3f3f;
12 using namespace std;
13 
14 char map[3][3];
15 char a[3]; //用来记录谁赢的 
16 int cnt;
17 
18 void add(char x) //用来记录谁赢的 
19 {
20     for(int i=0;i<cnt;i++)
21         if(a[i]==x) return;
22     a[cnt++]=x;
23 }
24 //标记数组,用来标记已经取得胜利的牛. 
25 int v[25];
26 int vt[25][25];
27 
28 int main()
29 {
30     for(int i=0;i<3;i++)
31     {
32         for(int j=0;j<3;j++)
33             cin>>map[i][j];
34         getchar();
35     }
36     int ans=0,res=0;
37     for(int i=0;i<3;i++)//扫一遍横的 
38     {
39        cnt=0;
40        for(int j=0;j<3;j++)
41         add(map[i][j]);
42         if(cnt==1&&!v[a[0]-'A']) ans++,v[a[0]-'A']=1;
43         if(cnt==2&&!vt[a[0]-'A'][a[1]-'A']) res++,vt[a[0]-'A'][a[1]-'A']=vt[a[1]-'A'][a[0]-'A']=1;
44         memset(a,0,sizeof(a));  
45     }
46 
47     for(int j=0;j<3;j++)//扫一遍竖的 
48     {
49         cnt=0;
50         for(int i=0;i<3;i++)
51             add(map[i][j]);
52         if(cnt==1&&!v[a[0]-'A']) ans++,v[a[0]-'A']=1;
53         if(cnt==2&&!vt[a[0]-'A'][a[1]-'A']) res++,vt[a[0]-'A'][a[1]-'A']=vt[a[1]-'A'][a[0]-'A']=1;
54         memset(a,0,sizeof(a));
55     }
56 
57     cnt=0;
58     for(int i=0;i<3;i++) //扫一遍正对角线 
59     {
60         add(map[i][i]);
61     }
62     if(cnt==1&&!v[a[0]-'A']) ans++,v[a[0]-'A']=1;
63         if(cnt==2&&!vt[a[0]-'A'][a[1]-'A']) res++,vt[a[0]-'A'][a[1]-'A']=vt[a[1]-'A'][a[0]-'A']=1;
64         memset(a,0,sizeof(a));
65 
66     cnt=0;
67     for(int i=0;i<3;i++) //扫一遍副对角线 
68     {
69         add(map[i][2-i]);
70     }
71     if(cnt==1&&!v[a[0]-'A']) ans++,v[a[0]-'A']=1;
72         if(cnt==2&&!vt[a[0]-'A'][a[1]-'A']) res++,vt[a[0]-'A'][a[1]-'A']=vt[a[1]-'A'][a[0]-'A']=1;
73         memset(a,0,sizeof(a));
74 
75     cout<<ans<<endl<<res<<endl;
76     return 0;
77 }

 

 

 

上一篇:Scala 函数入门之过程、lazy值和异常


下一篇:2019 GDUT Rating Contest III : Problem A. Out of Sorts