当时没想到,现在感觉思路打开就好了
思路:每次遇到一个部分就把身体其他部分一起变为一个不可能的符号并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;
}