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));