数据结构和算法笔记(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;
}
}
sylar
MAIL: cug@live.cn

浙公网安备 33010602011771号