欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

实验一

程序员文章站 2022-03-01 21:03:51
...

二分查找

#include<iostream>
using namespace std;
int a[10000+10];
bool BinarySearch(int s,int e,int v);
int main(){
	int n,m,v;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	cin>>m;
	for(int i=1;i<=m;i++){
		cin>>v;
		if(BinarySearch(0,n-1,v))cout<<"Yes"<<endl;
		else cout<<"No"<<endl;
	}
	return 0;
}
bool BinarySearch(int s,int e,int v){
	if(s==e){
		return a[s]==v;
	}
	else{
		int mid=(s+e)/2;
		if(a[mid]==v)return true;
		else if(a[mid]<v)return BinarySearch(mid+1,e,v);
		else if(a[mid]>v)return BinarySearch(s,mid,v);
	}
}

归并排序

#include<iostream>
using namespace std;
int a[10000+10],b[10000+10];
void MergeSort(int s,int e);
void Merge(int s,int m,int e);
int main(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	MergeSort(0,n-1);
	for(int i=0;i<n;i++){
		cout<<a[i]<<endl;
	}
	return 0;
}
void Merge(int s,int m,int e){
	int i=s,j=m,k=s;
	while(i<m&&j<=e){
		while(a[i]<=a[j]&&i<m&&j<=e){
			b[k++]=a[i++];
		}
		while(a[j]<=a[i]&&i<m&&j<=e){
			b[k++]=a[j++];
		} 
	}
	while(i<m){
		b[k++]=a[i++];
	}
	while(j<=e){
		b[k++]=a[j++];
	}
	for(int r=s;r<=e;r++){
		a[r]=b[r];
	}
}
void MergeSort(int s,int e){
	if(s==e)return;
	else{
		int mid=(s+e)/2;
		MergeSort(s,mid);
		MergeSort(mid+1,e);
		Merge(s,mid+1,e);
	}
}

快速排序

#include<iostream>
using namespace std;
int a[10000+10];
void Qsort(int s,int e);
int divide(int s,int e);
void Swap(int& a,int& b);
int main(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	Qsort(0,n-1);
	for(int i=0;i<n;i++){
		cout<<a[i]<<endl;
	}
	return 0;
}
void Swap(int& a,int& b){
	int t=a;a=b;b=t;
}
int divide(int s,int e){
	int v=a[s],i=s+1,j=e;
	while(i<j){
		while(i<j&&a[i]<=v){
			i++;
		}
		while(i<j&&a[j]>=v){
			j--;
		}
		Swap(a[i],a[j]);
	}
	if(a[i]<=v){
		Swap(a[i],a[s]);
		return i;
	}
	else{
		Swap(a[i-1],a[s]);
		return i-1;
	} 
}
void Qsort(int s,int e){
	if(s>=e)return;
	else{
		int q=divide(s,e);
		Qsort(s,q-1);
		Qsort(q+1,e);
	}
}

穷举n位二进制数

#include<iostream>
using namespace std;
int n;
int a[25];
void make(int m);
int main(){
	cin>>n;
	make(0);
	return 0;
}
void make(int m){//已经填了m位,也就是下标为m-1的地方填好了,要填m位 
	if(m==n){
		for(int i=0;i<n;i++){
			cout<<a[i];
		}
		cout<<endl;
	}
	else{
		for(int i=0;i<=1;i++){
			a[m]=i;
			make(m+1); 
		}
	}
}

穷举所有排列(交换法)

#include<iostream>
using namespace std;
int n;
int a[15]; 
void Swap(int& a,int& b);
void make(int m);
int main(){
	cin>>n;
	for(int i=0;i<n;i++)a[i]=i;
	make(0);
	return 0;
}
void Swap(int& a,int& b){
	int t=a;a=b;b=t;
}
void make(int m){//已经填了m个字母也就是说下标为m-1已经填好了,要填第m个 
	if((m+1)==n){
		for(int i=0;i<n;i++){
			cout<<char('a'+a[i]);
		}
		cout<<endl;
	}
	else{
		for(int i=m;i<n;i++){
			Swap(a[i],a[m]);
			make(m+1);
			Swap(a[i],a[m]);
		}
	}
}

穷举所有排列

#include<iostream>
using namespace std;
int n;
int a[15]; 
void make(int m);
int main(){
	cin>>n;
	make(0);
	return 0;
}
void make(int m){//已经填了m个字母也就是说下标为m-1已经填好了,要填第m个 
	if(m==n){
		for(int i=0;i<n;i++){
			cout<<char('a'+a[i]);
		}
		cout<<endl;
	}
	else{
		for(int i=0;i<n;i++){
			int flag=1;
			for(int j=0;j<m;j++){
				if(a[j]==i){
					flag=0;
					break;
				}
			}
			if(flag){
				a[m]=i;
				make(m+1);
			}
		}
	}
}

求第k小数

#include<iostream>
using namespace std;
int a[10000+10];
int search(int s,int e,int k);
int divide(int s,int e);
void Swap(int& a,int& b);
int main(){
	int n,k;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	cin>>k;
	cout<<search(0,n-1,k)<<endl;
	return 0;
}
void Swap(int & a,int & b){
	int t=a;a=b;b=t;
}
int divide(int s,int e){
	int v=a[s],i=s+1,j=e;
	while(i<j){
		while(i<j&&a[i]<=v){
			i++;
		}
		while(i<j&&a[j]>=v){
			j--;
		}
		Swap(a[i],a[j]);
	}
	if(a[i]<=v){
		Swap(a[i],a[s]);
		return i;
	}
	else if(a[i]>v){
		Swap(a[i-1],a[s]);
		return i-1;
	}
}
int search(int s,int e,int k){
	if(s==e)return a[s];
	else{
		int q=divide(s,e);
		if(q-s+1==k)return a[q];
		else if(q-s+1>k)return search(s,q-1,k);
		else if(q-s+1<k)return search(q+1,e,k-(q-s+1));
	}
}

循环赛日程表

#include<iostream>
using namespace std;
int a[128+10][128+10];
void bmake(int s,int e);
int main(){
	int n;
	cin>>n;
	n=1<<n;
	for(int i=1;i<=n;i++){
		a[i][1]=i;
	}
	bmake(1,n);
	for(int i=1;i<=n;i++){
		for(int j=1;j<n;j++){
			cout<<a[i][j]<<' ';
		}
		cout<<a[i][n]<<endl;
	}
	return 0;
}
void bmake(int s,int e){
	if(s+1==e){
		a[s][2]=e;
		a[e][2]=s;
	}
	else{
		int m=(s+e)/2;
		bmake(s,m);
		bmake(m+1,e);
		for(int i=0;i<=m-s;i++){
			for(int j=0;j<=m-s;j++){
				a[m+1+i][2+m-s+j]=a[s+i][1+j];
				a[s+i][2+m-s+j]=a[m+1+i][1+j];
			}
		}
	}
}

走迷宫

#include<iostream>
using namespace std;
int a[25][25];
int m,n;
int s,t,c,d;
void dfs(int x,int y){
	a[x][y]=-1;
	if(x==c&&y==d){
		cout<<"Yes"<<endl;
		return;
	}
	else{
		if(x-1>=0&&a[x-1][y]!=1&&a[x-1][y]!=-1){
			dfs(x-1,y);
		}
		if(y+1<n&&a[x][y+1]!=1&&a[x][y+1]!=-1){
			dfs(x,y+1);
		}
		if(x+1<m&&a[x+1][y]!=1&&a[x+1][y]!=-1){
			dfs(x+1,y);
		}
		if(y-1>=0&&a[x][y-1]!=1&&a[x][y-1]!=-1){
			dfs(x,y-1);
		}
	}
}
int main(){
	cin>>m>>n;
	cin>>s>>t>>c>>d;
	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
			cin>>a[i][j];
		}
	}
	dfs(s,t);
	if(a[c][d]!=-1)cout<<"No"<<endl;
	return 0;
}