算法

桶排序:

#include <iostream>
using namespace std;

int main()
{
	int book[1001], i,j,t,n;	
	for(i=0;i<1001;i++){
		book[i]=0;
	}
	cout<<"please input the datas:";

	cin>>n;
	for(i=1;i<=n;i++){
		cin>>t;	
		book[t]++;
	}
	for(i=1000;i>=0;i--)
		for(j=1;j<=book[i];j++)
			cout<<i<<" ";
	
	system("pause");
	return 0;

}

  

冒泡排序:

#include <iostream>
using namespace std;

int main()
{	
	int array[6],  n, temp, i,j;
	cout<<"Please input n: "<<endl;
	cin>>n;
	cout<<"Please input array: "<<endl;
	for(i = 1;i<=n;i++){
		cin>>array[i];
	}
	
	for(i=1;i<=n-1;i++) {
		for(j=1;j<=n-i;j++){
			if(array[j]<array[j+1]){
				temp=array[j];
				array[j]=array[j+1];
				array[j+1]=temp;
			}
		}
	}
	for(i=1;i<=n;i++){
		cout<<array[i]<<endl;
	}
	system("pause");

}

  

快速排序:

#include <iostream>
using namespace std;
int a[101],n;
void quicksort(int left,int right)
{
	int i,j,t,temp;
	if(left>right)
		return;

	temp=a[left];  // 基准数
	i=left;
	j=right;
	while(i!=j)
	{
		while(a[j]>=temp&&i<j)
			j--;
		while(a[i]<=temp&&i<j)
			i++;
		if(i<j)
		{
			t=a[i];
			a[i]=a[j];
			a[j]=t;
		}
	}
	//将基准数归位
	a[left]=a[i];
	a[i]=temp;
	quicksort(left,i-1);
	quicksort(i+1, right);
}

int main()
{
	int i;
	cout<<"please input datas:";
	cin>>n;
	for(i=0;i<n;i++)
	{
		cin>>a[i];
	}
	quicksort(0,n-1);
	for(i=0;i<n;i++)
	{
		cout<<a[i]<<" ";
	}
	system("pause");
	return 0;
}

 

按顺序输出不重复的数据:

#include <iostream>
using namespace std;

int main()
{
	int book[1001], i,j,t,n;	
	for(i=0;i<1001;i++){
		book[i]=0;
	}
	cout<<"please input the datas:";

	cin>>n;
	for(i=1;i<=n;i++){
		cin>>t;	
		book[t]=1;
	}
	for(i=0;i<1000;i++)
		if(book[i]==1)
			cout<<i<<" ";
	
	system("pause");
	return 0;
}

冒泡排序的方法:

#include <iostream>
using namespace std;

int main()
{	
	int array[101],  n, temp, i,j;
	cout<<"Please input n: "<<endl;
	cin>>n;
	cout<<"Please input array: "<<endl;
	for(i = 1;i<=n;i++){
		cin>>array[i];
	}
	
	for(i=1;i<=n-1;i++) {
		for(j=1;j<=n-i;j++){
			if(array[j]<array[j+1]){
				temp=array[j];
				array[j]=array[j+1];
				array[j+1]=temp;
			}
		}
	}
	cout<<array[1]<<" ";
	for(i=2;i<=n;i++){
		if(array[i]!=array[i-1])
		cout<<array[i]<<" ";
	}
	system("pause");

}

 

qq号码解密:

规则是这样的:首先将第1 个数删除,紧接着将第2 个数放到
这串数的末尾,再将第3 个数删除并将第4 个数放到这串数的末尾,再将第5 个数删除……
直到剩下最后一个数,将最后一个数也删除

#include <iostream>
using namespace std;

struct queue
{
	int data[100];
	int head;
	int tail;
};

int main()
{
	struct queue q;
	int i;
	q.head=1;
	q.tail=1;

	for(i=1;i<=9;i++)
	{
		cin>>q.data[q.tail];
		q.tail++;
	}

	while(q.head<q.tail)
	{
		//打印队首,将队首出列
		cout<<q.data[q.head]<<" ";
		q.head++;

		//新队首添加到队尾
		q.data[q.tail]=q.data[q.head];
		q.tail++;
		//队首出列
		q.head++;
	}

	system("pause");
	return 0;
}

 

栈: 判断回文: xyzyx, xyzzyx:

#include <iostream>
using namespace std;

int main()
{
	char a[101],s[101];
	int top, i,len,mid,next;
	cin>>a;
	len=strlen(a);
	mid=len/2-1;
	top=0;
	for(i=0;i<=mid;i++)
	{
		s[++top]=a[i];
	}

	if(len%2==0)
		next=mid+1;
	else
		next=mid+2;

	for(i=next;i<=len-1;i++)
	{
		if(a[i]!=s[top])
			break;
		top--;
	}

	if(top==0)
		cout<<"YES"<<endl;
	else
		cout<<"NO!"<<endl;
	system("pause");
	return 0;
}

  

队列+栈:小猫钓鱼游戏:

#include <iostream>
using namespace std;

struct queue
{
int data[1000];
int head;
int tail;
};

struct stack
{
int data[10];
int top;
};

int main()
{
	struct queue q1,q2;
	struct stack s;
	int book[10];
	int i,t;
	//初始化队列
	q1.head=1; q1.tail=1;
	q2.head=1; q2.tail=1;
	//初始化栈
	s.top=0;
	//初始化用来标记的数组,用来标记哪些牌已经在桌上
	for(i=1;i<=9;i++)
		book[i]=0;
	
	//依次向队列插入6个数
	//小哼手上的6张牌
	for(i=1;i<=6;i++)
	{
		cin>>q1.data[q1.tail];
		q1.tail++;
	}
//小哈手上的6张牌
	for(i=1;i<=6;i++)
	{
		cin>>q2.data[q2.tail];
		q2.tail++;
	}
	while(q1.head<q1.tail && q2.head<q2.tail ) //当队列不为空的时候执行循环
	{
		t=q1.data[q1.head];//小哼出一张牌
		//判断小哼当前打出的牌是否能赢牌
		if(book[t]==0) //表明桌上没有牌面为t的牌
		{
			//小哼此轮没有赢牌
			q1.head++; //小哼已经打出一张牌,所以要把打出的牌出队
			s.top++;
			s.data[s.top]=t; //再把打出的牌放到桌上,即入栈
			book[t]=1; //标记桌上现在已经有牌面为t的牌
		}
		else
		{
			//小哼此轮可以赢牌
			q1.head++;//小哼已经打出一张牌,所以要把打出的牌出队
			q1.data[q1.tail]=t;//紧接着把打出的牌放到手中牌的末尾
			q1.tail++;
			while(s.data[s.top]!=t) //把桌上可以赢得的牌依次放到手中牌的末尾
			{
				book[s.data[s.top]]=0;//取消标记
				q1.data[q1.tail]=s.data[s.top];//依次放入队尾
				q1.tail++;
				s.top--; //栈中少了一张牌,所以栈顶要减1
			}
		}
		t=q2.data[q2.head]; //小哈出一张牌
		//判断小哈当前打出的牌是否能赢牌
		if(book[t]==0) //表明桌上没有牌面为t的牌
		{
			//小哈此轮没有赢牌
			q2.head++; //小哈已经打出一张牌,所以要把打出的牌出队
			s.top++;
			s.data[s.top]=t; //再把打出的牌放到桌上,即入栈
			book[t]=1; //标记桌上现在已经有牌面为t的牌
		}
		else
		{
		//小哈此轮可以赢牌
			q2.head++;//小哈已经打出一张牌,所以要把打出的牌出队
			q2.data[q2.tail]=t;//紧接着把打出的牌放到手中牌的末尾
			q2.tail++;
			while(s.data[s.top]!=t) //把桌上可以赢得的牌依次放到手中牌的末尾
			{
				book[s.data[s.top]]=0;//取消标记
				q2.data[q2.tail]=s.data[s.top];//依次放入队尾
				q2.tail++;
				s.top--;
			}
		}
	}
	if(q2.head==q2.tail)
	{
		cout<<"小哼win"<<endl;
		cout<<"小哼当前手中的牌是"<<endl;
		for(i=q1.head;i<=q1.tail-1;i++)
		cout<<q1.data[i]<<endl;
		if(s.top>0) //如果桌上有牌则依次输出桌上的牌
		{
			cout<<"桌上的牌是"<<endl;
			for(i=1;i<=s.top;i++)
			cout<<s.data[i]<<endl;
		}
		else
			cout<<"\n桌上已经没有牌了"<<endl;
	}
	else
	{
		cout<<"小哈win"<<endl;
		cout<<"小哈当前手中的牌是"<<endl;
		for(i=q2.head;i<=q2.tail-1;i++)
		cout<<q2.data[i]<<endl;
		if(s.top>0) //如果桌上有牌则依次输出桌上的牌
		{
			cout<<"桌上的牌是"<<endl;
			for(i=1;i<=s.top;i++)
			cout<<s.data[i]<<endl;
		}
		else
			cout<<"桌上已经没有牌了"<<endl;
	}
		
	system("pause");
	return 0;
}

  

链表, 输入一个排序好的数, 然后插入一个数, 要求也要排序好.

#include <iostream>
using namespace std;

struct node
{
	int data;
	struct node *next;
};
int main()
{
	struct node *head, *p,*q,*t;
	int i,n,a;
	cin>>n;
	head=NULL;
	for(i=1;i<=n;i++)
	{
		cin>>a;
		p=(struct node *)malloc(sizeof(struct node));
		p->data=a;
		p->next=NULL;

		if(head==NULL)
			head=p;
		else q->next=p;

		q=p;
	}

	cin>>a;
	t=head;
	while(t!=NULL)
	{
		if(t->next->data>a)
		{
			p=(struct node *)malloc(sizeof(struct node));
			p->data=a;
			p->next=t->next;
			t->next=p;
			break;
		}
		t=t->next;
	}

	t=head;
	while(t!=NULL)
	{
		cout<<t->data<<" ";
		t=t->next;
	}

	system("pause");
	return 0;
}

  

 

枚举算法:火柴摆出A+B=C

1. 加号和等号都是需要2根

2. A+B=C, B+A=C是不同的等式

3. 所有火柴棍都要用上

#include <iostream>
using namespace std;

int fun(int x)
{
	int num=0;
	int f[10]={6,2,5,5,4,5,6,3,7,6}; //0-9每个数字需要几根火柴
	while(x/10!=0)
	{
		num+=f[x%10];
		x=x/10;
	}

	num+=f[x]; //此时就剩个位数了
	return num;

}
int main()
{
	int a,b,c,m,i,sum=0;
	cin>>m;

	for(a=0;a<=1111;a++)
	{
		for(b=0;b<=1111;b++)
		{
			c=a+b;
			if(fun(a)+fun(b)+fun(c)==m-4)
			{
				cout<<a<<"+"<<b<<"="<<c<<endl;
				sum++;
			}
		}
	}
	cout<<"共拼出"<<sum<<"种不同的等式"<<endl;
	system("pause");
	return 0;
}

  

 

深度优先算法, 全排列问题:

#include <iostream>
using namespace std;

int a[10],book[10],n;

void dfs(int step)
{
	int i;
	if(step==n+1)
	{
		for(i=1;i<=n;i++)
			cout<<a[i];
		cout<<endl;
		return;
	}
	for(i=1;i<=n;i++)
	{
		if(book[i]==0)
		{
			a[step]=i;
			book[i]=1;
			dfs(step+1);
			book[i]=0;
		}
	}
	return;
}
int main()
{
	cin>>n;
	dfs(1);
	system("pause");
	return 0;
}

  

posted @ 2016-02-25 17:31  wujixing909  阅读(153)  评论(0编辑  收藏  举报