通过set进行标记(思想很简单,实现起来有点容易错)set(红黑树:效率高)
思路:
对行列和长度进行枚举;
对三个顶点进行排序
储存顶点后计数输出
#include<iostream> #include<set> #include<algorithm> #include<string> using namespace std; char a[103][102]; int n; char b[5]; set<string>s; int main () { cin>>n; n++; for(int i=0;i<n;i++) cin>>a[i]; for(int i=0;i<n-1;i++) for(int j=0;j<=i;j++) { for(int t=1;t<=n-1-i;t++) { b[0]=a[i][j]; b[1]=a[i+t][j]; b[2]=a[i+t][j+t]; sort(b,b+3); s.insert(b); } } for(int i=1;i<n-1;i++) for(int j=1;j<=i;j++) { for(int t=1;t<=min(j,n-i-1);t++) { b[0]=a[i][j]; b[1]=a[i][j-t]; b[2]=a[i+t][j]; sort(b,b+3); s.insert(b); } } //set<string>::iterator it; //for(it=s.begin();it!=s.end();it++) // cout<<*it<<endl; cout<<s.size(); return 0; }