数据结构和算法笔记(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;
	}
}
原文地址:https://www.cnblogs.com/SuperXJ/p/1754228.html