zoukankan      html  css  js  c++  java
  • 数据结构和算法笔记(3)

    // test6.8.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    
    
    //题目1:一个运动员打靶,靶一共有十环,问该运动员打十次打中90环的可能性有多少种?
    #include <iostream>
    using namespace std;
    int sum;
    int store[10];
    
    void output()
    {
    	for (int i = 9;i>=0; --i)
    	{
    		cout<<store[i]<<" ";
    	}
    	cout<<endl;
    	++sum;
    }
    void cumput(int score, int num)//num次射击需要获得的分数score
    {
    	//退出条件
    	//需要获得负分,显然不可能
    	//需要获得的分数 > num次射击每次都打中10环 显然也不可能 
    	if(score <0|| score>(num+1)*10)//提前结束穷举的条件
    		return;
    	if (num == 0)//最后一次射击需要射中剩余的分数score。。。
    	{
    		store[num] = score;
    		output(); //输出一次的结果,store[0] 表示最后一次射击的分数 store[9]表示第一次!
    		return;
    	}
    
    	//执行递归,分析如下:
    	/*
    	从第一次打靶中的环数(0-10环)开始测试,第一次假设第一靶打中0环,然后计算第二靶,会发现第二靶只有=10才能满足if(score <0|| score>(num+1)*10)这个条件。依次类推,直到if (num == 0)即最后一环=10 然后输出!。 这样结束一次查找。 第二次类似,首先假设第一靶打中1环,………………。使用递归和穷举法的速度优势就在于if(score <0|| score>(num+1)*10)这个条件,递归可以人为的提前判断结束,而不用每次都将结果计算出来。
    	*/
    	for (int i =0;i<=10;++i)  //这个循环开始穷举。。。
    	{
    		store[num] = i;
    		cumput(score-i, num-1);
    	}
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	cumput(90, 9);
    	cout<<"sum:"<<sum<<endl;
    	return 0;
    	return 0;
    }
    
    
    /*
    题目2:八皇后问题,求所以的可能情况。
    用三个一维数组来分别记录每一列,每个45度的斜线,每个135度的斜线上是否已经被放置的棋子控制。
    */
    #include <iostream>
    using namespace std;
    
    static char Queen[8][8];
    static int a[8];                 //列冲突则 a[i] =1
    static int b[15];               //45°冲突则 =1
    static int c[15];              //135°冲突
    static int iQueenNum=0;
    
    void qu(int i)
    {
    	int icolumn;
    	for (icolumn=0; icolumn<8; icolumn++)  //依次遍历每一列
    	{
    		//i表示行 icolumn表示列  queen[i][icolumn] 是否冲突 是否可以放置皇后?
    		if (a[icolumn] == 0 && b[i - icolumn+7] == 0 && c[i+icolumn]==0)
    		{
    			Queen[i][icolumn] = '@';
    			a[icolumn] = 1;
    			b[i - icolumn + 7] =1;
    			c[i+icolumn]=1;
    			if (i<7) 
    			{
    				qu(i+1);   //放下一个。
    				//当无法再放下一个的时候qu()会退出。
    			}
    			else  //完成了一次组合!!!输出结果
    			{
    				int iLine , iColumn;
    				printf("第%d种状态为:\n", ++iQueenNum);
    				for (iLine = 0; iLine<8; iLine++ )
    				{
    					for (iColumn=0; iColumn<8; iColumn++)
    					{
    						printf("%c ", Queen[iLine][iColumn]);
    					}
    					printf("\n");
    				}
    					printf("\n\n");
    			}
    
    			//无法放了,回溯(清除上一个皇后状态)。
    			Queen[i][icolumn] ='*';
    			a[icolumn]=0;
    			b[i-icolumn+7]=0;
    			c[i + icolumn] = 0;
    		}
    	}
    }
    
    int main()
    {
    	int iLine, iColumn;
    	for (iLine=0; iLine<8; iLine++)
    	{
    		a[iLine] = 0;         //每列都没有冲突
    		for (iColumn=0; iColumn<8; iColumn++)
    		{
    			Queen[iLine][iColumn]='*';        //初始化为每个位置为 *
    		}
    		for (iLine=0;iLine<15;iLine++)
    		{
    			b[iLine] = c[iLine] = 0;           //45 135 均没有冲突
    		}
    		qu(0);  //开始
    		return 0;
    	}
    }
    
  • 相关阅读:
    8月6日总结
    8月4日总结
    8月3日总结
    快速幂计算题解
    7月31日总结
    7月30日总结
    关于PHP中”::”能够调用一个非静态的方法的解释
    码云 使用 svn 管理项目
    Mysql的数据类型
    thinkphp5的$this->fetch()
  • 原文地址:https://www.cnblogs.com/SuperXJ/p/1754228.html
Copyright © 2011-2022 走看看