1.
源代码:
#include <stdio.h>
void FindtheMinimum(int a,int b,int c)
{
int t;
if(a>b)
t=a,a=b,b=t;
if(b>c)
t=b,b=c,c=t;
if(a>b)
t=a,a=b,b=t;
printf("%d\n",a);
}
int main()
{
int a,b,c;
while(scanf("%d %d %d",&a,&b,&c)!=EOF)
FindtheMinimum(a,b,c);
return 0;
}
程序截图:
2.
源代码:
#include <stdio.h>
#define maxn 25
int main()
{
int i,j,a[maxn][maxn];
int m,n,N;
char direction;
while(scanf("%d",&N)!=EOF)
{
for(i=0;i<N;i++)
for(j=0;j<N;j++)
a[i][j]=0;
scanf("%d %d",&m,&n);
scanf("%c",&direction);
if(direction=='w')
{
if(m-1>=0 && m-1<N)
printf("Y\n");
else
printf("N\n");
}
else if(direction=='s')
{
if(m+1>=0 && m+1<N)
printf("Y\n");
else
printf("N\n");
}
else if(direction=='a')
{
if(n-1>=0 && n-1<N)
printf("Y\n");
else
printf("N\n");
}
else if(direction=='d')
{
if(n+1>=0 && n+1<N)
printf("Y\n");
else
printf("N\n");
}
}
return 0;
}
程序截图:
3.
源代码:
#include <stdio.h>
#define maxn 105
int main()
{
int i,j,a[maxn][maxn];
int m,n,N,direction;
int nextloc;
while(scanf("%d",&N)!=EOF)
{
for(i=0;i<N;i++)
for(j=0;j<N;j++)
scanf("%d",&a[i][j]);
scanf("%d %d",&m,&n);
scanf("%d",&direction);
if(direction==0)
{
nextloc=a[m][n-1];
if(n-1>=0 && n-1<N && nextloc==0)
printf("Y\n");
else
printf("N\n");
}
else if(direction==1)
{
nextloc=a[m+1][n];
if(m+1>=0 && m+1<N && nextloc==0)
printf("Y\n");
else
printf("N\n");
}
else if(direction==2)
{
nextloc=a[m][n+1];
if(n+1>=0 && n+1>N && nextloc==0)
printf("Y\n");
else
printf("N\n");
}
else if(direction==3)
{
nextloc=a[m-1][n];
if(m-1>=0 && m-1<N && nextloc==0)
printf("Y\n");
else
printf("N\n");
}
}
return 0;
}
程序截图:
4.
源代码:
#include <stdio.h>
#include <string.h>
#define maxlen 256
void GetNextval(char b[],int nextval[])
{
int j=0,k=-1;
int lenb=strlen(b);
nextval[0]=-1;
while(j<lenb)
{
if(k==-1 || b[j]==b[k])
{
j++,k++;
if(b[j]!=b[k])
nextval[j]=k;
else
nextval[j]=nextval[k];
}
else
k=nextval[k];
}
}
void Replace(char a[],char b[],char c[])
{
int nextval[maxlen],i=0,j=0;
int lena=strlen(a),lenb=strlen(b),lenc=strlen(c);
int t; //t记录匹配点
GetNextval(b,nextval);
while(i<lena && j<lenb)
{
if(j==-1 || a[i]==b[j])
{
i++;
j++;
}
else
j=nextval[j];
}
if(j>=lenb)
t=i-lenb;
for(i=0;i<t;i++)
printf("%c",a[i]);
printf("%s",c);
for(i=t+lenb;i<lena;i++)
printf("%c",a[i]);
printf("\n");
}
int main()
{
char a[maxlen],b[maxlen],c[maxlen];
while(scanf("%s",a)!=EOF)
{
scanf("%s",b);
scanf("%s",c);
Replace(a,b,c);
}
return 0;
}
程序截图:
===================================我是分割线===================================
回顾与拓展:串的模式匹配(KMP算法)
5. 输入主串source与模式串obj(长度<=1000),在主串中寻找模式串,找到返回第一个匹配主串的首字符下标,否则返回-1
源代码:
#include <stdio.h>
#include <string.h>
#define maxlen 1010
void GetNextval(char obj[],int nextval[]) //使用修正后的求nextval数组算法
{
int j=0,k=-1;
int len=strlen(obj);
nextval[0]=-1;
while(j<len)
{
if(k==-1 || obj[j]==obj[k])
{
j++,k++;
if(obj[j]!=obj[k])
nextval[j]=k;
else
nextval[j]=nextval[k];
}
else
k=nextval[k];
}
}
void KMP(char source[],char obj[])
{
int nextval[maxlen];
int i=0,j=0;
int len1=strlen(source),len2=strlen(obj);
GetNextval(obj,nextval);
while(i<len1 && j<len2)
{
if(j==-1 || source[i]==obj[j])
i++,j++;
else
j=nextval[j];
}
if(j>=len2)
printf("%d\n",i-len2);
else
printf("-1\n");
}
int main()
{
char source[maxlen],obj[maxlen];
while(gets(source)!=NULL)
{
gets(obj);
KMP(source,obj);
}
return 0;
}
程序截图:
6. 采用顺序结构存储串,编写一个算法计算指定子串在一个字符串中出现的次数,如果该子串不出现则为0
源代码:
#include <stdio.h>
#include <string.h>
#define maxlen 1010
void Objcount(char source[],char obj[])
{
int i=0,j=0,count=0; //count-子串出现次数
int len1=strlen(source),len2=strlen(obj);
while(i<len1 && j<len2)
{
if(source[i]==obj[j]) //主串与子串字符相同,继续匹配下一个字符
{
i++;
j++;
}
else //否则主串、子串指针回溯,重新开始下一次匹配
{
i=i-j+1;
j=0;
}
if(j>=len2) //如果j已经达到了子串的长度,产生了一个匹配
{
count++; //匹配次数+1
i=i-j+1; //主串从下一个位置开始继续匹配
j=0; //子串从头开始匹配
}
}
printf("%d\n",count);
}
int main()
{
char source[maxlen],obj[maxlen];
while(gets(source)!=NULL)
{
gets(obj);
Objcount(source,obj);
}
return 0;
}
程序截图: