原题
题目大意
题目背景是给一个九宫格棋局,棋局里面的相同字母表示同一头牛下的棋,让你判断有多少头牛是个体赢的,有多少头牛组队赢的,组队赢的是指若同一行是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 }