1.给定一个字符串,计算字符串中数值的个数并求和。其中还包含了负号,若 紧跟负号的是一个数值,则表示这是一个负数,若后面跟着的不是数字,则不表 示什么。
输入:一个字符串
输出:数值个数 数值和 列子
输入:312ab-2-- -9--a
输出:3 301
#include<stdio.h>
#include<string.h>
char c[10000];
int l,i,n,zf,res,temp;
void main()
{
while(gets(c)!=NULL)
{
l=strlen(c);
res=0,n=0; //res表示所有数字的和,j用来计数字的个数
for(i=0;i<l;i++)
{
if(c[i]>='0'&&c[i]<='9')
{
zf=(c[i-1]!='-'||i==0)?1:0;
temp=0;
n++;
while(c[i]>='0'&&c[i]<='9')
{
temp=temp*10+c[i]-'0';
i++;
}
if(zf==1)
res+=temp;
else
res-=temp;
}
}
printf("%d %d\n",n,res);
memset(c,'\0',sizeof(c));
}
}
原来自己写出的代码很复杂,就去看了看别人的。。。。。以上是借鉴大神的版本。
2.给定一个数字矩阵,如果上下左右数值相同,则表示是一个连通的区域。 求矩阵中连通块的数量。
输入: 先是矩阵的行数和列数 接着是矩阵
输出: 连通块的数量
Sample Input
5 6
4 4 4 4 4 4
4 2 3 3 1 4
4 2 2 3 1 4
4 2 3 3 1 4
4 4 4 4 4 4
Sample Output
4
#include<stdio.h>
#define MAXN 10000
int go_x[4]={0,0,1,-1};
int go_y[4]={1,-1,0,0};
int visited[MAXN][MAXN],map[MAXN][MAXN],n,m;
int judge(int x,int y,int value)
{
if(x>=n||y>=m||x<0||y<0)
return 0;
if(visited[x][y]==1)
return 0;
if(value==map[x][y])
return 1;
return 0;
}
void DFS(int x,int y)
{
visited[x][y]=1;
for(int i=0;i<4;i++)
{
int xx=x+go_x[i];
int yy=y+go_y[i];
if(judge(xx,yy,map[x][y])==1)
DFS(xx,yy);
}
}
void main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
int cnt=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
scanf("%d",&map[i][j]);
visited[i][j]=0;
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(visited[i][j]==0)
{
DFS(i,j);
cnt++;
}
}
}
printf("%d\n",cnt);
}
}
深度优先算法。参考https://blog.csdn.net/qq_37230495/article/details/88366106