C语言

螺旋矩阵

螺旋矩阵
代码

#include "stdafx.h"
#include "stdio.h"
#include "math.h"
int main()
{
	int i,j,k=0,n;
	printf("输入一个大于2小于20的整数:");
	scanf("%d",&n);
	int N1=n;
	int N=abs(n);
	if(n<0)
		n=-n;
	
	int A[20][20];
	int begin=0,sum=1;

	while(true){
		i=begin;
		j=begin;
		for(k=0;k<4;k++){
		
			switch(k){
			case 0:{
				for(j=begin;j<n-1;j++){     //列加一
					A[i][j]=sum++;
				}
				j=n-1;
				   }
				break;
			case 1:{
				for(i=begin;i<n-1;i++){      //行加一
					A[i][j]=sum++;
				}
				i=n-1;
				   };
				break;
			case 2:{
				for(j=j;j>begin;j--) {     //列减一
					A[i][j]=sum++;
				}
				j=j;
				   };
				break;
			case 3:{
				for(i=i;i>begin;i--) {     //行减一
					A[i][j]=sum++;
				}
				i=i-1;
				   };
				break;
			}  //switch
		}  //for
	
		n--;
		begin++;
		int x=n-begin;
		if(x<0)
			break;
	}  //while
	if(N%2==1){
		int k=N/2;
			A[k][k]=sum++;
			printf("%d\n",A[k][k]);
	}
	/*输出*/
	
printf("输出为\n");
	for(i=0;i<N;i++){
		for(j=0;j<N;j++){
			if(N1>0)
				printf("%d\t",A[i][j]);
			else
				printf("%d\t",A[j][i]);
		}
		printf("\n");
	}
	return 0;
}

结果样例
在这里插入图片描述

消除游戏

在这里插入图片描述
代码

#include "stdafx.h"
#include "stdlib.h"
#include "math.h"
#include "time.h"
#include "stdlib.h"

int fun(int j1,int j2,int i,int A1[10][10]);
int fun1(int i[5],int i2,int j,int A1[10][10]);
int main(int argc, char* argv[])
{
	long  s,f;
	s=clock();
	int i,j,m,n;
	int A[10][10],A1[10][10];
	scanf("%d %d",&m,&n);

	/*用例方法二
	srand(time(0));
	for(i=0;i<m;i++){
		for(j=0;j<n;j++)
			A[i][j]=rand()%3+1;      //产生1~3的随机数
			
	}
	
	//int A[4][5]={{1,2,2,2,4},{1,2,3,3,5},{1,2,2,5,6},{3,4,3,6,2}};
	for(i=0;i<m;i++){
		for(j=0;j<n;j++){
			printf("%d ",A[i][j]);
			A1[i][j]=1;
		}
		printf("\n");
	} 
	*/
	FILE *fp;
	fp = fopen("消除.txt","r");
	if(!fp){
		printf("enrro\n");
		return -1;
	}
	if(fp){
	for(i=0;i<m;i++)
		for(j=0;j<n;j++)
			fscanf(fp,"%d",&A[i][j]);
	printf("\n");
	}

	int sum1[5]={1,1,1,1,1}; //行的标记函数
	int i1[10]={0},i2;
	
	for(i=0;i<m;i++)
	{
		int j1=0,j2=0,sum=1;
		for(j=0;j<n;j++)  //每个数组的值的循环遍历
		{
			if(j>0){
				j2=j;
				if(A[i][j]==A[i][j-1])
				{
					sum++;
					if(sum>2){
						fun(j1,j2,i,A1);   //标记函数
					}
				
				}
				else
				{
					j1=j2;
					sum=1;
				}
			}   //if

			
			if(i>0)
			{
				i2=i;
				
				if(A[i][j]==A[i-1][j])
				{
					sum1[j]++;
					if(sum1[j]>2){
						fun1(i1,i2,j,A1);
					}
				}
				else
				{
					i1[j]=i;
					sum1[j]=1;

				}

			}

		}

	}

	//输出

	for(i=0;i<m;i++){
		for(j=0;j<n;j++){
			if(A1[i][j]==0)
				printf("%d ",A1[i][j]);
			else
				printf("%d ",A[i][j]);
		}
		printf("\n");
	} 
	//fclose(fp);
	f=clock();
	printf("运行时间:%ld\n",f-s);
	return 0;
}


int fun(int j1,int j2,int i,int A1[10][10]){     //行置0
	for(j1;j1<=j2;j1++)
	{
		A1[i][j1]=0;
	}
	return 0;
}

int fun1(int i1[5],int i2,int j,int A1[10][10]){   //列置0
	int i=i1[j];
	for(i;i<=i2;i++)
	{
		A1[i][j]=0;
	}
	
	return 0;
}

结果样例
在这里插入图片描述

文本文件单词统计

统计在这样的英文文本文件中,出现了多少个单词(不区分大小写),每个单词出现了几次。连续的英文字符(不包括数字)都认为是单词,单词之间用空格或标点符号分隔。
代码

#include "stdafx.h"

#include "stdio.h"
#include "stdlib.h"
#include "string.h"


#define LIST_INIT_SIZE 100    //线性表存储空间的初始分配量
#define LISTINCREMENT 10      //线性表存储空间的分配增量
#define OK 1
#define OVERFLOW -2
#define ERROR -1



typedef struct{
    char word[21];            //存储单词,不超过20个字符
    int count;                //单词出现的次数
}ElemType;

 //顺序表元素类型
typedef struct{
    ElemType *elem;           //存储空间基址
    int length;               //当前长度
	int listsize;             //当前分配的存储容量
} Sqlist;                    //顺序表类型

/*构造一个空的线性表L*/
int InitList(Sqlist &L){
	L.elem = (ElemType *) malloc (LIST_INIT_SIZE*sizeof(ElemType));
	if(!L.elem)
		exit(OVERFLOW);
	L.length=0;
	L.listsize = LIST_INIT_SIZE;
	return OK;
}

/*插入顺序表*/
int ListInsert(Sqlist &L,int i,char *s){
	int j;
	if(L.length>=L.listsize)         //当前存储已满,增加空间
	{

		ElemType *newbase;
		newbase =(ElemType*) realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));

		if(!newbase){
			printf("exdepend fail!!");
			exit(OVERFLOW);
		}
		L.elem=newbase;
		L.listsize += LISTINCREMENT;        //增加存储容量

	}

	for(j=L.length;j>=i;j--)
      L.elem[j]=L.elem[j-1];

    strcpy(L.elem[i-1].word,s);
	L.elem[i-1].count=1;
	++L.length;
	return OK;
}

/*在顺序表中查找单词*/
int LocateElem(Sqlist &L,char *s)
{
	int end=L.length;
	int begin=0,mid;
	int j=0;
	while(begin<=end)        //折半查找
	{
		mid=(begin+end)/2;
		if(strcmp(L.elem[mid].word,s)==0)
		{
			++L.elem[mid].count;
			return 0;
		}
		else
		{
			if (strcmp(L.elem[mid].word,s)>0)
			{
				end=mid-1;
			}
			if (strcmp(L.elem[mid].word,s)<0)
			{	
				begin=mid+1;
			}
		}


	}
	return begin+1;
}

/*输出函数*/
int PrintList(Sqlist &L,int count){
	FILE *fw1;
	fw1=fopen("aa.txt","w");
	fprintf(fw1,"总单词数量为%d\n",count);
	//int sum;
	for(int i=0;i<L.length;i++)
	{
		fprintf(fw1,"%s 的数量为:  \t",L.elem[i].word);
		fprintf(fw1,"%d \n",L.elem[i].count);
		//sum+=sum+L.elem[i].count;
	}
	//fprintf(fw1,"总单词数量为%d\n",sum);
	fclose(fw1);
	return 0;
}

int main(int argc, char* argv[])
{
	int i,j,count=0,m;
	char  s[21],ch;    //str

	FILE *fp1;
	fp1=fopen ("单词.txt","r");
	if(!fp1)
	{
		printf("can't open file\n");
		return -1;
	}
	Sqlist L;
	InitList(L);
	i=0;
	while((ch = fgetc(fp1)) != EOF)
	{
		if(ch>='A'&&ch<='Z'||ch>='a'&&ch<='z')
		{
			if(ch>='A'&&ch<='Z')
				ch=ch+32;
			s[i++]=ch;
			m=1;
		}
		else
		{
			if(m==1){

			s[i++]='\0';
			count++;
			i=0;
			j=LocateElem(L,s);
			if(j>0)
				ListInsert(L,j,s);
			m=0;
			}
		}
	}
	PrintList(L,count);
	fclose(fp1);    //关闭文件

	return 0;
}

结果样例:
在这里插入图片描述

最小生成数

在这里插入图片描述
在这里插入图片描述
代码

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "String.h"

#define TRUE	1
#define FALSE	0

#define MAX_VERTEX_NUM	20     //最大顶点个数
#define MaxCost  1000
#define VERTEX_NUM	7         
#define ARC_NUM	10
#define INF 99	//最大值∞,INT_MAX
typedef struct Graph{
	int vexs[MAX_VERTEX_NUM];				// 顶点向量,默认V1,V2,V3,V4,...
	int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];      // 弧的信息                     
	int vexnum, arcnum;					// 顶点数,弧数         
}Graph;//图

typedef struct{
	int adjvex;
	int lowcost;
}closedge[MAX_VERTEX_NUM];  //辅助数组  记录最小代价
/*创建图*/
int CreateGraph(Graph &G, int value[][VERTEX_NUM]){
	G.vexnum = VERTEX_NUM, G.arcnum = ARC_NUM;
	
	for(int i = 0; i < G.vexnum; ++i){
		G.vexs[i] = (char)(i+65);	//顶点
		for(int j = 0; j < G.vexnum; ++j)
			G.arcs[i][j] = value[i][j];	//弧
	}
	return 0;
}
void PrintGraph(Graph &G,int sum){
	printf("邻接矩阵(Adjacency Array),VERTEX_NUM:%d\tARC_NUM:%d", VERTEX_NUM, ARC_NUM);
	for(int i = 0; i < G.vexnum; ++i){
		printf("\n");
		for(int j = 0; j < G.vexnum; ++j)
			if(G.arcs[i][j]!=INF)
				printf("%3d", G.arcs[i][j]);
			else
				printf(" ∞");
	}
	printf("\n");
	printf("最小代价为%d\n",sum);
}//printUDN

int MiniSpanTree_Prim(Graph G,int n){
	int lowcost[100];
	int mst[100];
	int i, j, min, minid, sum = 0;
	for (i = 2; i <= n; i++)
	{
		lowcost[i] = G.arcs[1][i];
		mst[i] = 1;
	}
	mst[1] = 0;
	for (i = 2; i <= n; i++)
	{
		min = MaxCost;
		minid = 0;
		for (j = 2; j <= n; j++)
		{
			if (lowcost[j] < min && lowcost[j] != 0)
			{
				min = lowcost[j];
				minid = j;
			}
		}
		sum += min;
		lowcost[minid] = 0;
		for (j = 2; j <= n; j++)
		{
			if (G.arcs[minid][j] < lowcost[j])
			{
				lowcost[j] = G.arcs[minid][j];
				mst[j] = minid;
			}
		}
	}
	return sum;
}
int main(int argc, char* argv[])
{
	int value[][VERTEX_NUM]={	INF,  7 , INF,  5, INF, INF,INF,
								 7 , INF,  8 ,  9,  7 , INF,INF,
								INF,  8 , INF, INF, 5 ,  9 ,INF,
								 5 ,  9 , INF, INF, 15,  6 ,INF,
								INF,  7 ,  5 , 15 , INF, 8 , 9 ,
								INF, INF, INF,  6 ,  8 , INF,11,
								INF, INF, INF, INF,  9 , 11, INF
								};
	Graph G;
	CreateGraph(G, value);
	int sum=MiniSpanTree_Prim(G,VERTEX_NUM);
	PrintGraph(G,sum);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值