// 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; } }