1、配置文件恢复(超时)
#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;
int main(){
char str[15];
char strFirst[10];
char strSecond[10];
//问题一?如何判断输入的是一个命令还是两个命令 用gets读取
//getchar();
gets(str); //注意使用gets要包含头文件<stdio.h>
//对输入的数据做处理
//1.首先知道输入中间是否有空格,并且得到先后输入的命令
bool flag=false; //有空格则为true
int i,j;
int Fnum=0,Snum=0;
for(i=0;;i++){
if(!flag && str[i]!='\0' && str[i]!=' '){
strFirst[Fnum++]=str[i];
}else if(flag && str[i]!='\0' && str[i]!=' '){
strSecond[Snum++]=str[i];
}
if(str[i]==' ') flag=true;
if(str[i]=='\0') break;
}
strFirst[Fnum++]='\0';
strSecond[Snum++]='\0';
//2.如果只有一个命令,则匹配reset,匹配失败则输出失败
bool flag1=true; //true代表匹配上了
char reset[6]={"reset"};
if(!flag){ //只有一条命令
for(i=0;;i++){
if(strFirst[i]!='\0' && reset[i]!='\0' && strFirst[i]!=reset[i]){ //没有读完就继续进行比较
flag1 = false;
}else if(strFirst[i]=='\0'){ //命令读完了
break;
}else if(reset[i]=='\0' && strFirst[i]!='\0'){
flag1 = false;
}
}
if(flag1){
cout<<"reset what";
}else{
cout<<"unkown command";
}
}else{
//2.如果有两条命令,则分别比较
//匹配第一条,分别匹配 reset board reboot backplane
string strJudge1[4]={"reset","board","reboot","backplane"};
bool num1[4]={true,true,true,true};
for(j=0;j<4;j++){
//开始匹配
for(i=0;;i++){
if(strFirst[i]!='\0' && strJudge1[j][i]!='\0' && strFirst[i]!=strJudge1[j][i]){ //没有读完就继续进行比较
num1[j] = false;
}else if(strFirst[i]=='\0'){ //命令读完了
break;
}else if(strJudge1[j][i]=='\0' && strFirst[i]!='\0'){
num1[j] = false;
}
}
}
//3.继续匹配下一个
string strJudge2[5]={"board","add","delet","backplane","abort"};
bool num2[5]={true,true,true,true,true};
for(j=0;j<5;j++){
//开始匹配
for(i=0;;i++){
if(strSecond[i]!='\0' && strJudge2[j][i]!='\0' && strSecond[i]!=strJudge2[j][i]){ //没有读完就继续进行比较
num2[j] = false;
}else if(strSecond[i]=='\0'){ //命令读完了
break;
}else if(strJudge2[j][i]=='\0' && strSecond[i]!='\0'){
num2[j] = false;
}
}
}
bool num3[5]={false,false,false,false,false};
//执行输出
if(num1[0]==true && num2[0]==true){
num3[0]=true;
}
if(num1[1]==true && num2[1]==true){
num3[1]=true;
}
if(num1[1]==true && num2[2]==true){
num3[2]=true;
}
if(num1[2]==true && num2[3]==true){
num3[3]=true;
}
if(num1[3]==true && num2[4]==true){
num3[4]=true;
}
int count=0; //统计匹配上的数量
int save;
for(int i=0;i<5;i++){
if(num3[i]==true){
count++;
save=i;
}
}
if(count==1){
if(save==0){
cout<<"board fault";
}else if(save==1){
cout<<"where to add";
}else if(save==2){
cout<<"no board at all";
}else if(save==3){
cout<<"impossible";
}else if(save==4){
cout<<"install first";
}
}else{
cout<<"unkown command";
}
}
return 0;
}
火车进站
#include<iostream>
#include<string>
#include<stdio.h>
using namespace std;
int n;
int* add(int list[],int num1,int num2){
int temp = list[num1];
list[num1] = list[num2];
int i;
for(i=num2;i>num1;i--)
if((i-1)==num1){
list[i] = temp;
}else{
list[i] = list[i-1];
}
return list;
}
void fun(int list[],int begin,int end){
int i,j,k;
if(begin == end){
//进行判断是否符合出栈规则
for(j=0;j<n;j++){ //从左到右
for(k=j+1;k<n;k++){
list[k]<list[j]; //右边的数字小于左边的
}
}
for(i=0;i<n;i++) cout<<list[i]<<" ";
cout<<endl;
}else{
for(i=begin;i<=end;i++){
//swap(list[begin],list[i]);
list = add(list,begin,i);
fun(list,begin+1,end);
//swap(list[begin],list[i]);
list = add(list,begin,i);
}
}
}
//全排列
int main(){
//数据初始化
cin>>n;
int list[100];
int i;
for(i=0;i<n;i++){
cin>>list[i];
}
//对数据进行排序
int j;
int temp;
for(int i=0;i<n;i++){
for(int j=i;j<n;j++){
if(list[i]>=list[j]){
temp = list[i];
list[i] = list[j];
list[j] = temp;
}
}
}
}
字符串最后一个单词的长度
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
//初始化数据
char str[1000];
gets(str);
//获取字符串长度
int len=0;
int i;
for(i=0;str[i]!='\0';i++){
if(str[i]==' '){
len = 0;
}else{
len++;
}
}
cout<<len;
}
坐标移动
#include<iostream>
using namespace std;
int main(){
//数据初始化
int x=0;
int y=0;
char str[1000];
cin>>str;
//获得字符串长度
int len=0;
int i,j,k;
for(i=0;str[i]!='\0';i++){
len++;
}
//cout<<"字符串长度:"<<len<<endl;
//
char commd[10]; //存储命令
int clen=0; //存储命令长度
bool flag=true;
for(i=0;i<len;i++){
if(str[i]!=';'){
commd[clen++]=str[i];
}else{ //对命令进行分析处理,处理之后归0
//判断str[1]到str[clen-1]内是否有字符
int num=0;
int maxnum=1;
//获得最高位
for(k=0;k<clen-2;k++){
maxnum*=10;
}
//判断数字是否符合要求,并返回数字大小
for(j=1;j<clen;j++){
if(!(commd[j]>='0'&&commd[j]<='9')){ //如果不符合要求
flag=false;
}else{ //如果符合要求
int n = commd[j]-'0';
num+=(n*maxnum);
maxnum/=10;
}
}
//如果符合要求,计算数字大小
if(flag){
if(commd[0]=='A'){
x-=num;
//cout<<"x减"<<num<<endl;
}else if(commd[0]=='D'){
x+=num;
//cout<<"x加"<<num<<endl;
}else if(commd[0]=='W'){
y+=num;
//cout<<"y加"<<num<<endl;
}else if(commd[0]=='S'){
y-=num;
//cout<<"y减"<<num<<endl;
}
}
//归0
flag = true;
clen = 0;
}
}
//输出
cout<<x<<","<<y;
return 0;
}
购物单
#include<iostream>
#include<cstdio>
using namespace std;
int v[100][3];
int w[100][3];
int max(int n1,int n2){
int max=n1;
if(n2>max){
max=n2;
}
return max;
}
int max(int n1,int n2,int n3){
int max=n1;
if(n2>max){
max=n2;
}
if(n3>max){
max=n3;
}
return max;
}
int max(int n1,int n2,int n3,int n4){
int max=n1;
if(n2>max){
max=n2;
}
if(n3>max){
max=n3;
}
if(n4>max){
max=n4;
}
return max;
}
int max(int n1,int n2,int n3,int n4,int n5){
int max=n1;
if(n2>max){
max=n2;
}
if(n3>max){
max=n3;
}
if(n4>max){
max=n4;
}
if(n5>max){
max=n5;
}
return max;
}
int f(int i,int j){ // i:主件标号 j:金钱数目
if(i<0 || j<0){
return 0;
}else{
int maxNum;
if((j-v[i][0])<0){ //买不起主件
maxNum = f(i-1,j);
}else if((j-v[i][0]-v[i][1])<0 && (j-v[i][0]-v[i][2])<0){ //买得起主件,但买不起附件1和附件2
maxNum=max(
f(i-1,j), //什么都不买
f(i-1,j-v[i][0])+v[i][0]*w[i][0] //买主件
);
}else if((j-v[i][0]-v[i][1])<0 && (j-v[i][0]-v[i][2])>0){ //买得起主件、附件2
maxNum=max(
f(i-1,j), //什么都不买
f(i-1,j-v[i][0])+v[i][0]*w[i][0], //买主件
f(i-1,j-v[i][0]-v[i][2])+v[i][0]*w[i][0]+v[i][2]*w[i][2] //买主件和附件二
);
}else if((j-v[i][0]-v[i][1])>0 && (j-v[i][0]-v[i][2])<0){ //买得起主件、附件1
maxNum=max(
f(i-1,j), //什么都不买
f(i-1,j-v[i][0])+v[i][0]*w[i][0], //买主件
f(i-1,j-v[i][0]-v[i][1])+v[i][0]*w[i][0]+v[i][1]*w[i][1] //买主件和附件一
);
}else if(((j-v[i][0]-v[i][1])>0 && (j-v[i][0]-v[i][2])>0) && (j-v[i][0]-v[i][1]-v[i][2])<0){
maxNum=max(
f(i-1,j), //什么都不买
f(i-1,j-v[i][0])+v[i][0]*w[i][0], //买主件
f(i-1,j-v[i][0]-v[i][1])+v[i][0]*w[i][0]+v[i][1]*w[i][1], //买主件和附件一
f(i-1,j-v[i][0]-v[i][2])+v[i][0]*w[i][0]+v[i][2]*w[i][2] //买主件和附件二
);
}else if((j-v[i][0]-v[i][1]-v[i][2])>0){
maxNum=max(
f(i-1,j), //什么都不买
f(i-1,j-v[i][0])+v[i][0]*w[i][0], //买主件
f(i-1,j-v[i][0]-v[i][1])+v[i][0]*w[i][0]+v[i][1]*w[i][1], //买主件和附件一
f(i-1,j-v[i][0]-v[i][2])+v[i][0]*w[i][0]+v[i][2]*w[i][2], //买主件和附件二
f(i-1,j-v[i][0]-v[i][1]-v[i][2])+v[i][0]*w[i][0]+v[i][1]*w[i][1]+v[i][2]*w[i][2] //买主件和附件一和附件二
);
}
return maxNum;
}
}
int main(){
/*数据初始化*/
int N,m; //N:金钱总额 m:希望购买物品的个数
cin>>N>>m;
int V[100],P[100],Q[100]; //分别对应物品的价格 重要度 主从
int i;
for(i=0;i<m;i++){
cin>>V[i]>>P[i]>>Q[i];
}
/*数据主从分类*/
//第一步.得到主件
int mainNum=0; //主件数目
int number[100]; //记录编号对应mainNum
int addnumber[100]; //记录附件数量
for(i=0;i<m;i++){ //若是主件,对应编号是i+1
if(Q[i]==0){
number[i+1]=mainNum;
v[mainNum][0]=V[i];
w[mainNum][0]=P[i];
addnumber[mainNum]=1; //主件附件标号初始化
mainNum++; //主件数目加一
}
}
//第二步.附件信息初始化
for(i=0;i<mainNum;i++){
v[i][1]=0;
v[i][2]=0;
w[i][1]=0;
w[i][2]=0;
}
//第三步.得到附件
for(i=0;i<m;i++){
if(Q[i]!=0){
int a = number[Q[i]]; //a即代指mainNum主件标号
v[a][addnumber[a]]=V[i];
w[a][addnumber[a]]=P[i];
addnumber[a]++;
}
}
/*
//测试:信息输出
for(i=0;i<mainNum;i++){
cout<<"主件"<<i+1<<"价值:"<<v[i][0]<<" 重要度:"<<w[i][0]<<endl;
cout<<"主件"<<i+1<<"附件1的"<<"价值:"<<v[i][1]<<" 重要度:"<<w[i][1]<<endl;
cout<<"主件"<<i+1<<"附件2的"<<"价值:"<<v[i][2]<<" 重要度:"<<w[i][2]<<endl<<endl;
}
*/
/*正式处理*/
int result = f(mainNum-1,N);
cout<<result;
return 0;
}
图片整理
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
int main(){
char str[1000];
cin>>str;
int len=0;
int i,j;
for(i=0;str[i]!='\0';i++){
len++;
}
char temp;
for(i=0;i<len;i++)
for(j=i+1;j<len;j++){
if(str[i]>str[j]){
temp = str[j];
str[j]= str[i];
str[i]= temp;
}
}
for(i=0;i<len;i++){
cout<<str[i];
}
return 0;
}
合唱队
#include<iostream>
using namespace std;
int N;
int height[1000];
int array[1000]; //记录是否出列
bool judge(int array[],int len){
int i;
int heightLen=0;
int heightTemp[1000];
int maxHeight;
int maxLocal;
//得到未出列的身高
for(i=0;i<len;i++){
if(array[i]==0){
heightTemp[heightLen++]=height[i];
}
}
if(heightLen!=0){
maxHeight = heightTemp[0];
maxLocal = 0;
//得到最高的身高
for(i=0;i<heightLen;i++){
if(maxHeight<heightTemp[i]){
maxHeight = heightTemp[i];
maxLocal = i;
}
}
//判断是否符合
bool flag = true;
for(i=0;i<maxLocal;i++){
if(!(heightTemp[i]<heightTemp[i+1])){
flag = false;
break;
}
}
for(i=maxLocal;i<heightLen-1;i++){
if(!(heightTemp[i]>heightTemp[i+1])){
flag = false;
break;
}
}
return flag;
}else{ //全出列
return false;
}
}
int fun(int local,int array[]){ //哪一队,之前的出列数组
int s1,s2;
if(local<N-1){
//local位置出列
array[local]=1;
if(judge(array,local+1)){
s1 = 1+fun(local+1,array);
}else{
s1 = N;
}
//local位置不出列
array[local]=0;
if(judge(array,local+1)){
s2 = fun(local+1,array);
}else{
s2 = N;
}
}else{
//1、出列
//判断是否符合要求
array[local]=1;
if(judge(array,N)){
s1 = 1;
}else{
s1 = N;
}
//2、不出列
array[local]=0;
if(judge(array,N)){
s2 = 0;
}else{
s2 = N;
}
}
return s1<s2?s1:s2; //返回较小者
}
int main(){
//数据初始化
cin>>N;
int i;
for(i=0;i<N;i++){
cin>>height[i];
}
//正式处理
int result = fun(0,array);
cout<<result;
return 0;
}
名字的漂亮度
#include<iostream>
using namespace std;
int main(){
int N;
char str[100]; //存储字符串
int score[100]; //记录漂亮度的得分
cin>>N;
int i,j,k;
for(i=0;i<N;i++){
//字符串初始化
cin>>str;
//获取字符串长度
int len=0;
for(j=0;str[j]!='\0';j++){
len++;
}
//统计每类字母的出现次数
int count[26]={0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,0};
for(j=0;j<len;j++){
int local = (str[j]-'A'<=25 && str[j]-'A'>=0)?str[j]-'A':str[j]-'a';
count[local]++;
}
//对count排序
for(j=0;j<26;j++){
for(k=j+1;k<26;k++){
if(count[j]<count[k]){
int temp = count[k];
count[k] = count[j];
count[j] = temp;
}
}
}
//进行漂亮度的统计
score[i]=0;
for(j=0;j<26;j++){
score[i]+=(26-j)*count[j];
}
}
//输出结果
for(i=0;i<N;i++){
cout<<score[i]<<endl;
}
return 0;
}
IP匹配
#include<iostream>
#include<stdlib.h>
using namespace std;
bool funKey(int *array){
bool flag=true;
int i;
for(i=0;i<=3;i++){
if(array[i]!=255 && array[i]!=0){
flag = false;
}else if(i!=3 && array[i]==0 && array[i+1]!=0){
flag = false;
}
}
return flag;
}
bool fun(char str[],int len,char local){
int localSign[100]; //记录local出现的位置
int localLen=0;
int i;
bool flag = true;
//localSign初始化
for(i=0;i<len;i++){
if(str[i]==local){
localSign[localLen++]=i;
}
}
//判断是否符合规范
for(i=0;i<localLen-1;i++){
if(localSign[i+1]-localSign[i]==1){
flag = false;
}
}
return flag;
}
/*
*方法名:splitFun
*参数:str 原始字符串 / len 原始字符串长度 / local 拆分标准 / array 存储拆分后的字符
*返回:查分得到的数字个数
*/
int* splitFun(char str[],int len,char local){
int localSign[100]; //记录local出现的位置
int localLen=0;
int i,j;
int num=0; //array位置
int* array = (int *)malloc(sizeof(int)*4); //记得要及时free
//localSign初始化
for(i=0;i<len;i++){
if(str[i]==local){
localSign[localLen++]=i;
}
}
//array初始化
for(i=0;i<=localLen;i++){ //例如有3个'.' 则分为了4段
if(i==0){
int number = 1;
array[num] = 0;
for(j=localSign[0]-1;j>=0;j--){
array[num] += number*(str[j]-'0');
number*=10;
}
num++;
}else if(i==localLen){
int number = 1;
array[num] = 0;
for(j=len-1;j>=localSign[i-1]+1;j--){
array[num] += number*(str[j]-'0');
number*=10;
}
num++;
}else{
int number = 1;
array[num] = 0;
for(j=localSign[i]-1;j>=localSign[i-1]+1;j--){
array[num] += number*(str[j]-'0');
number*=10;
}
num++;
}
}
return array;
}
int main(){
char str[100][1000]; //存储输入的IP以及子网掩码
int numCount=0;
int num[7]={0,0,0,0,0,0,0}; // 01234 ABCDE 5错误的IP或掩码 私有的IP
int i;
while(cin>>str[numCount]){
int numIP[4]; //存储IP 4个数字 0~ipLen-1
int numKey[4];//存储子网掩码 4个数字 ipLen+1~len-1
char strIP[100];
char strKey[100];
int len=0;
int ipLen=0;
int keyLen=0;
//获得str的长度
for(i=0;str[numCount][i]!='\0';i++){
len++;
}
//获得IP地址的长度
for(i=0;str[numCount][i]!='~';i++){
ipLen++;
}
//获得子网掩码的长度
keyLen = len-ipLen-1;
//获得strIP
int count = 0;
for(i=0;i<ipLen;i++){
strIP[count++]=str[numCount][i];
}
//获得strKey
count=0;
for(i=ipLen+1;i<len;i++){
strKey[count++]=str[numCount][i];
}
//判断IP是否符合规范
bool flag1 = fun(strIP,ipLen,'.');
//判断掩码是否符合规范
int *keyArray = splitFun(strKey,keyLen,'.');
bool flag2 = funKey(keyArray);
if(flag1 && flag2){
//符合规范
//获得IP的四个数字
int *array = splitFun(strIP,ipLen,'.');
//判断属于哪类IP
if(array[1]>=0 && array[1]<=255 && array[2]>=0 && array[2]<=255 &&
array[3]>=0 && array[3]<=255 ){
if(array[0]>=1 && array[0]<=126){
num[0]++;
}else if(array[0]>=128 && array[0]<=191){
num[1]++;
}else if(array[0]>=192 && array[0]<=223){
num[2]++;
}else if(array[0]>=224 && array[0]<=239){
num[3]++;
}else if(array[0]>=240 && array[0]<=255){
num[4]++;
}
//判断是否是私有
if(
(array[0]>=10 && array[0]<=10 && array[1]>=0 && array[1]<=255 &&
array[2]>=0 && array[2]<=255 && array[3]>=0 && array[3]<=255)
||
(array[0]>=172 && array[0]<=172 && array[1]>=16 && array[1]<=31 &&
array[2]>=0 && array[2]<=255 && array[3]>=0 && array[3]<=255)
||
(array[0]>=192 && array[0]<=192 && array[1]>=168 && array[1]<=168 &&
array[2]>=0 && array[2]<=255 && array[3]>=0 && array[3]<=255)
)
{
num[6]++;
}
}else{
num[5]++;
}
}else{
//不符合规范
num[5]++;
}
numCount++;
}
//输出结果
for(i=0;i<7;i++){
if(i!=6)
cout<<num[i]<<" ";
else
cout<<num[i];
}
return 0;
}
字符串统计
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
//数据初始化
char str[1000];
gets(str);
//获取数据长度
int i;
int len=0;
for(i=0;str[i]!='\0';i++){
len++;
}
//统计
int charNum=0;
int blankNum=0;
int numberNum=0;
int otherNum=0;
for(i=0;i<len;i++){
if((str[i]>='A' && str[i]<='Z')||(str[i]>='a' && str[i]<='z')){
charNum++;
}else if(str[i]==' '){
blankNum++;
}else if(str[i]>='0' && str[i]<='9'){
numberNum++;
}else{
otherNum++;
}
}
//输出结果
cout<<charNum<<endl<<blankNum<<endl<<numberNum<<endl<<otherNum;
return 0;
}