当时没想到,现在感觉思路打开就好了
思路:每次遇到一个部分就把身体其他部分一起变为一个不可能的符号并cnt++. 根据这个把相片从头到尾全部扫一遍就好。
#include<iostream>
#include<cstring>
using namespace std;
int H,W,cnt;
char photo[105][105];
const char m[3][4]={
{"-O-"},{"/|\\"},{"(-)"}}; //记录完整人的样子;
void change(int i,int j);
void print();
void count(int i,int j)
{if(photo[i][j]=='.') return ;else if(photo[i][j]=='O') change(i,j-1),cnt++;else if(photo[i][j]=='/') change(i-1,j),cnt++;else if(photo[i][j]=='|') change(i-1,j-1),cnt++;else if(photo[i][j]=='\\') change(i-1,j-2),cnt++;else if(photo[i][j]=='(') change(i-2,j),cnt++;else if(photo[i][j]==')') change(i-2,j-2),cnt++;
// print();
}
void change(int i,int j)
{for(int a=0;a<3;a++)for(int b=0;b<3;b++)if(i+a>=0&&i+a<H&&j+b>=0&&j+b<W&&m[a][b]==photo[i+a][j+b]) //一样就变为'.'photo[i+a][j+b]='.';
}
int main()
{int k;cin>>k;while(k--){cin>>H>>W;memset(photo,0,sizeof(photo));for(int i=0;i<H;i++)for(int j=0;j<W;j++)cin>>photo[i][j];cnt=0;for(int i=0;i<H;i++) //从头到尾遍历一遍;for(int j=0;j<W;j++)count(i,j);cout<<cnt;if(k) cout<<endl;}return 0;
}
void print()
{for(int i=0;i<H;i++){for(int j=0;j<W;j++)cout<<photo[i][j];cout<<endl;}cout<<endl;
}