蓝桥杯部分总结

1.求日历

#include<stdio.h>
int main(){
	int monthDays[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	int days=1000;
	int year=2014,month=11,day=9;
	int i;
	for(i=0;i<days;i++)
	     {
	     	day++;
	     	if(day>monthDays[month-1])
	     	    {
	     	    	day=1;
	     	    	month++;
	     	    	if(month>12)
	     	    	   {
	     	    	   	month=1;
	     	    	   	year++;
	     	    	   	if((year%400==0)||(year%4)==0&&year%100!=0)
	     	    	   	         monthDays[1]=29;
	     	    	   	else
	     	    	   			monthDays[1]=28;
						}
				 }
	     	
		 }
	  printf("%d-%d-%d\n",year,month,day);
	  return 0;
	
	
}

2.查找岛屿问题

#include<stdio.h>
int a[20][20],b[20][20];
int n,m,sum=0;
void dfs(int x,int y,int color){
   int tx,ty,k;
	int next[4][2]={ {0,1},{1,0},{0,-1},{-1,0}
 	};
 	a[x][y]=color;
 	for(k=0;k<4;k++){
 		tx=x+next[k][0];
 		ty=y+next[k][1];
 		if(tx<1||ty<1||tx>n||ty>m)
 		     continue;
 		if(a[tx][ty]>0&&b[tx][ty]==0){
 			  b[tx][ty]=1;
 			  ++sum;
 			  dfs(tx,ty,color);
		 }
	 }
	 return;
}

int main(){
	int i,j,num=0;
	scanf("%d %d",&n,&m);
	for(i=1;i<=n;i++)
	  for(j=1;j<=m;j++)
	     scanf("%d",&a[i][j]);
	for(i=1;i<=n;i++){
		for(j=1;j<=m;j++){
			if(a[i][j]>0){
				num--;
				b[i][j]=1;
				dfs(i,j,num);
			}
		}
	}
	
	for(i=1;i<=n;i++){
	  for(j=1;j<=m;j++)
	    printf("%3d",a[i][j]);
	    printf("\n");
}
printf("%d",-num);
}

3.无关图dfs遍历

#include<stdio.h>
 int n,m,sum=0;
 int e[20][20],book[20];
 
void dfs(int cur){
	int i;
	printf("%d ",cur);
	sum++;
	if(sum==n)  return;
	for(i=1;i<=n;i++){
		if(e[cur][i]==1&&book[i]==0){
			book[i]=1;
			dfs(i);
		}
	}
	return;
}
 int main(){
 	int i,j,a,b;
 	scanf("%d %d",&n,&m);
 	for(i=1;i<n;i++)
 	 for(j=1;j<n;j++)
 	    if(j==i)  e[i][j]=0;
 	    else  e[i][j]=999999;
	for(i=1;i<=m;i++){
	    scanf("%d %d",&a,&b);
 	    e[a][b]=1;
		e[a][b]=1;
 }
 book[1]=1;
 dfs(1);
}

4.有向图dfs遍历

#include<stdio.h>
int n,m,min=99999;
int e[20][20],book[20];
void dfs(int cur,int dis){
	int i;
	if(dis>min) return;
	if(cur==n){
		if(dis<min)
		  min=dis;
		  return;
	}
	for(i=1;i<=n;i++){
		if(e[cur][i]!=99999&&book[i]==0){
			book[i]=1;
			dfs(cur+1,dis+e[cur][i]);
			book[i]=0;
		}
	}
	return;
}
int main(){
	int i,j,a,b,c;
	scanf("%d %d",&n,&m);
	for(i=1;i<=n;i++)
	 for(j=1;j<=n;j++)
	     if(i==j)  e[i][j]=0;
	     else e[i][j]=99999;
	for(i=1;i<=m;i++){
		scanf("%d %d %d",&a,&b,&c);
		 e[a][b]=c;
	}
	book[1]=1;
	dfs(1,0);
	printf("%d",min);
	   
} 

5.求最短路径

#include<stdio.h>
int main(){
	int e[10][10],k,i,j,n,m,t1,t2,t3;
	int inf=9999;
	scanf("%d %d",&n,&m);
	 for(i=1;i<=n;i++)
	    for(j=1;j<=n;j++)
	      if(i==j)  e[i][j]=0;
	      else e[i][j]=inf;
	      for(i=1;i<=m;i++){
	      	scanf("%d %d %d",&t1,&t2,&t3);
	      	e[t1][t2]=t3;
		  }
		for(k=1;k<=n;k++){
			for(i=1;i<=n;i++)
			 for(j=1;j<=n;j++)
			   if(e[i][j]>e[i][k]+e[k][j])
			       e[i][j]=e[i][k]+e[k][j];
		}
	 for(i=1;i<=n;i++){
	 	for(j=1;j<=n;j++)
	 	  printf("%10d",e[i][j]);
	 	  printf("\n");
	 }
	    return 0;	    				
}

6.求单个源点到各个点的路径

#include<stdio.h>
int main(){
	int n,m,i,j,k,min,t1,t2,t3;
	int e[7][7],dis[7],book[7]={0};
	int inf=9999999;
	int count=0,sum=0;
	scanf("%d %d",&n,&m);
	for(i=1;i<=n;i++)
	 for(j=1;j<=n;j++)
	   if(i==j)  e[i][j]=0;
	   else   e[i][j]=inf;
	   for(i=1;i<=m;i++){
	   	 scanf("%d %d %d",&t1,&t2,&t3);
	   	 e[t1][t2]=t3;
	   	 e[t2][t1]=t3;
	   }
	for(i=1;i<=n;i++)
	   dis[i]=e[1][i];
	   book[1]=1;
	   count++;
	   while(count<n){
	   	min=inf;
	   	for(i=1;i<=n;i++)
	   	{
	   		if(book[i]==0&&dis[i]<min)
	   		{
	   			min=dis[i];j=i;
			   }
		   }
		book[j]=1;count++;sum=sum+dis[j];
		for(k=1;k<=n;k++){
			if(book[k]==0&&dis[k]>e[j][k])
			  dis[k]=e[j][k];
		}
	   }
	   printf("%d",sum);
	   return 0;
}

7.终定向,导入文件

1.重定向
#define LOCAL1
#include<stdio.h>
#include <stdlib.h>
#define INF 1000000000
int main()
{
#ifdef LOCAL1
freopen("C:/Users/Administrator/Desktop/data.in", "r", stdin);
freopen("C:/Users/Administrator/Desktop/data.txt", "w", stdout);
#endif
int x, n = 0, min = INF, max = -INF, s = 0;
while(scanf("%d", &x) == 1)
{
s += x;
if(x < min) min = x;
if(x > max) max = x;
/*
printf("x = %d, min = %d, max = %d\n", x, min, max);
*/
n++;
}
printf("%d %d %.3f\n", min, max, (double)s/n);
return 0;
}

8.读取文件

#include<stdio.h>
#define INF 1000000000
int main()
{
FILE *fin, *fout;
fin = fopen("C:/Users/Administrator/Desktop/data.in", "rb");
fout = fopen("C:/Users/Administrator/Desktop/data.out", "wb");
int x, n = 0, min = INF, max = -INF, s = 0;
while(fscanf(fin, "%d", &x) == 1)
{
s += x;
if(x < min) min = x;
if(x > max) max = x;
n++;
}
fprintf(fout, "%d %d %.3f\n", min, max, (double)s/n);
fclose(fin);
 fclose(fout);
return 0;
}

9.sprintf和strchr的使用方法

#include<stdio.h>
#include<string.h>
int main()
{
int count = 0;
char s[20], buf[99];
scanf("%s", s);
for(int abc = 111; abc <= 999; abc++)
for(int de = 11; de <= 99; de++)
{
int x = abc*(de%10), y = abc*(de/10), z = abc*de;
sprintf(buf, "%d%d%d%d%d", abc, de, x, y, z);
 int ok = 1;
for(int i = 0; i < strlen(buf); i++)
if(strchr(s, buf[i]) == NULL) ok = 0;
if(ok)
{
printf("<%d>\n", ++count);
printf("%5d\nX%4d\n-----\n%5d\n%4d\n-----\n%5d\n\n", abc, de, x, y, z);
}
}
printf("The number of solutions = %d\n", count);
return 0;
}

10.stl库的使用

    (3)a.back(); //返回a的最后一个元素
    (4)a.front(); //返回a的第一个元素
    (5)a[i]; //返回a的第i个元素,当且仅当a[i]存在2013-12-07
    (6)a.clear(); //清空a中的元素
    (7)a.empty(); //判断a是否为空,空则返回ture,不空则返回false
    (8)a.pop_back(); //删除a向量的最后一个元素
    (9)a.erase(a.begin()+1,a.begin()+3); //删除a中第1个(从第0个算起)到第2个元素,也就是说删除的元素从a.begin()+1算起(包括它)一直到a.begin()+         3(不包括它)
    (10)a.push_back(5); //在a的最后一个向量后插入一个元素,其值为5
    (11)a.insert(a.begin()+1,5); //在a的第1个元素(从第0个算起)的位置插入数值5,如a为1,2,3,4,插入元素后为1,5,2,3,4
    (12)a.insert(a.begin()+1,3,5); //在a的第1个元素(从第0个算起)的位置插入3个数,其值都为5
    (13)a.insert(a.begin()+1,b+3,b+6); //b为数组,在a的第1个元素(从第0个算起)的位置插入b的第3个元素到第5个元素(不包括b+6),如b为1,2,3,4,5,9,8         ,插入元素后为1,4,5,9,2,3,4,5,9,8
    (14)a.size(); //返回a中元素的个数;
(1)sort(a.begin(),a.end()); //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素进行从小到大排列
(2)reverse(a.begin(),a.end()); //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素倒置,但不排列,如a中元素为1,3,2,4,倒置后为4,2,3,1
(3)copy(a.begin(),a.end(),b.begin()+1); //把a中的从a.begin()(包括它)到a.end()(不包括它)的元素复制到b中,从b.begin()+1的位置(包括它)开        始复制,覆盖掉原有元素
(4)find(a.begin(),a.end(),10); //在a中的从a.begin()(包括它)到a.end()(不包括它)的元素中查找10,若存在返回其在向量中的位置

11.全排列函数

do {
for(int i = 0; i < n; i++) printf("%d ", p[i]); //输出排列p
printf("\n");
} while(next_permutation(p, p+n));

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值