螺旋矩阵
代码
#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;
}