您的位置:首页 > 其它

华为OJ(四)

2015-08-09 21:07 218 查看
1、火车进站

#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;
if(begin == end){
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
;
int i;
for(i=0;i<n;i++){
cin>>list[i];
}
fun(list,0,n-1);

}


出现编译错误,因为的数据初始化使用的是:

//数据初始化
cin>>n;
int list
;


编译器不支持这样使用,所以要申请一个固定大小的数组

而且数据初始化之后还没有排序,要加上排序,代码修改后如下:

#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;
if(begin == end){
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;
}
}
}

fun(list,0,n-1);

}


可惜还是编译没有通过,因为火车进站的输出序列的全排列输出不等同与全排列,有一些无法实现,例如输入:1 2 3,就不可能有3 1 2这样的输出。

重新整理了思路,模拟了车站进出的过程,运行成功了,代码如下:

#include<iostream>
#include<vector>
using namespace std;

int nStatic;     //火车总数量(在fun方法中表示还没有进站的火车数量)

void fun(char list[],vector<char> tmp,int in,int now,int n,int strNum,char str[]);

void funOut(char list[],vector<char> tmp,int in,int now,int n,int strNum,char str[]){
//火车出
vector<char>::iterator it = tmp.end() - 1;
//it = tmp.end() - 1;
//cout<<"Out:"<<*it<<" ";
str[strNum++]=*it;
tmp.pop_back();
in--;
fun(list,tmp,in,now,n,strNum,str);
}

void funIn(char list[],vector<char> tmp,int in,int now,int n,int strNum,char str[]){
//火车进
tmp.push_back(list[now]);
//cout<<"In:"<<list[now]<<" ";
in++;
now++; //有火车进入则执行now++
n--;
fun(list,tmp,in,now,n,strNum,str);
}

void fun(char list[],vector<char> tmp,int in,int now,int n,int strNum,char str[]){ //递归函数
if(in>0){ //有火车进入
//火车出
funOut(list,tmp,in,now,n,strNum,str);
if(n>0)
//火车进(如果还有火车没有进)
funIn(list,tmp,in,now,n,strNum,str);
else{
//如果火车全部出站
//cout<<"strNum:"<<strNum<<endl<<endl;
if(strNum==(nStatic-1)){
int i;
for(i=0;i<=strNum;i++){
if(i==strNum)
cout<<str[i]<<endl;
else
cout<<str[i]<<" ";
}
}
}

}else{ //没有火车进入
if(n>0)
//火车进(如果还有火车没有进)
funIn(list,tmp,in,now,n,strNum,str);
}

}

int main(){
int in=0;  //进入车站的火车数量
int now=0; //现在正准备进入的火车
char list[100];
char str[100];
vector<char> tmp;
//数据初始化
cin>>nStatic;
int strNum = 0;
int i;
for(i=0;i<nStatic;i++){
cin>>list[i];
}
//执行递归函数
fun(list,tmp,in,now,nStatic,strNum,str);
return 0;
}


2、输出字符串最后一个单词的长度

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: