• 算法


    桶排序:

    #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<<"
    桌上已经没有牌了"<<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;
    }
    

      

  • 相关阅读:
    STM8S PWM输出停止后 IO口电平输出
    STM8 输出比较极性
    无法打开包括文件: “corecrt.h”: No such file or directory
    VC++深入详解学习笔记
    x86系列微处理器中8种描述符表https://blog.csdn.net/u014162133/article/details/46573873
    计算机目录
    windbg双机调试
    二叉树
    list
    vector
  • 原文地址:https://www.cnblogs.com/wujixing/p/5217772.html
Copyright © 2020-2023  润新知