求一题的C++程序

描述 Description
一个由大写字母组成的方阵里面可能包含一些等腰直角三角形。这次他们要数出方阵中由各种字母组成的等腰直角三角形的数目,以及等腰直角三角形的总数,而你的任务是写一个程序来统计。方阵中的等腰直角三角形只有下面两种情况:
(1) 两条直角边分别跟方阵的边平行,例如:
AAA B
AA BB
A BBB
(2) 等腰直角三角形的斜边与方阵的边平行,例如:
A B
AAA BB
AAAAA BBB
BB
B
每个等腰直角三角形都不能少于3个字母。
输入格式 Input Format
文件的第一行是一个整数N(0<N<=100), 接下来总共有N行,每行有N个大写字母,描述的是一个N*N的大写字母方阵。行首与行末没有多余的空格。
输出格式 Output Format
第一行输出方阵中总共有多少个等腰直角三角形。然后对方阵中出现的每个字母,求出由它所组成的等腰直角三角形的个数,并按照字典顺序逐行输出。
样例输入 Sample Input
(I)
3
AAB
ABB
BBC

(II)
4
AABB
ABBB
BBBB
BBBB
样例输出 Sample Output
(I)
4
A 1
B 3
C 0

(II)
51
A 1
B 50

#include <stdio.h>
int n;
char fangzhen[100][100];
int zimu[10][2]={0,0};//原来数组中有0个元素(~[0][0])个

int xiangtong(int i, int j, int k,char c){//看看这个区间的字母是否相同~
int t=1;
while(j<=k){
if(fangzhen[i][j] != c)
t=0;
j++;
}
return t;
}
void tianjia(char c){//添加字母集合
int i=0,m=1;
while(zimu[i][0]){
if(zimu[i][0]==c){
m=0;
break;
}
i++;
}
if(m)
zimu[i][0]=c;

}
void zimujilu(char c, int t){//三角形字母数
int i=0;
while(zimu[i][0]){
if(zimu[i][0]==c){
zimu[i][1]+=t;
break;
}
i++;
}
}
void paixu(){
int i,j,m,n;
i=0;
while(zimu[i][0]){
j=i+1;
while(zimu[j][0]){
if(zimu[i][0]>zimu[j][0]){
m=zimu[i][0];zimu[i][0]=zimu[j][0];zimu[j][0]=m;
n=zimu[i][1];zimu[i][1]=zimu[j][1];zimu[j][1]=n;
}
j++;
}
i++;
}
}
int panduan(int i, int j, int k, char c, int a){//行数、左开头、右结尾、字母、标记~
int temp=0;
if(j<=k && xiangtong(i, j, k, c)){
if(j==k)
return 1;
else{
if(fangzhen[i-1][j]==c && (a==0 || a==1)){//左上型|\,
int t=1;
temp+=panduan(i-1, j, k-1, c, t);
}
if(fangzhen[i+1][j]==c && (a==0 || a==2)){//左下型|/,
int t=2;
temp+=panduan(i+1, j, k-1, c, t);
}
if(fangzhen[i-1][k]==c && (a==0 || a==3)){//右上型/|,
int t=3;
temp+=panduan(i-1, j+1, k, c, t);
}
if(fangzhen[i+1][k]==c && (a==0 || a==4)){//右下型\|.
int t=4;
temp+=panduan(i+1, j+1, k, c, t);
}
}
} printf("\n");
return temp;
}
void main()
{
int i,j,k,t=0,s;

printf("请输入你的字母方阵的长或宽:\n");
scanf("%d",&n);
printf("请输入你的字母方阵:\n");
for(i=0;i<n;i++)
{
for(j=0;j<=n;j++)
{
fangzhen[i][j]=getchar();
}
}

//打印方阵代码
for(i=0;i<n;i++)
{
for(j=1;j<=n;j++)
{
tianjia(fangzhen[i][j]);//设置字母集合
printf("%c ",fangzhen[i][j]);
} printf("\n");
}

//循环依次判断
for(i=0;i<n;i++)
{
for(j=1;j<=n;j++)
{
for(k=j+1;k<=n;k++)
{
if(!xiangtong(i, j, k, fangzhen[i][j]))
break;
s=panduan(i,j, k, fangzhen[i][j], 0);
t+=s;
zimujilu(fangzhen[i][j], s);
}
}
}

//输出题目想要的~
printf("%d\n",t);
paixu();
i=0;
while(zimu[i][0]){
printf("%c: %d\n",zimu[i][0],zimu[i][1]);
i++;
}
}
我花了将近两个小时的哦~~
——~~~ ^_^ ~~
温馨提示:答案为网友推荐,仅供参考
相似回答