// 实验00.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
using namespace std;
int i = 0;
void move01(char x, char y, char z, int n)
{
if (n == 1){
cout << x << "->" << z << endl;
}
else
{
move01(x, z, y, n - 1);
cout << x << "->" << z << endl;
move01(y, x, z, n-1); //注意这步!
}
}
int main0000(int argc, _TCHAR* argv[]) //汉诺塔问题
{
move01('x', 'y', 'z',32);
cout << i << endl;
return 0;
}
int k = 0;
int safe(int(*a)[8], int m, int n)
{
for (int i = 0; i < 8; i++)
if (a[m][i] == 1) { return 0; }
for (int i = 0; i < 8; i++)
if (a[i][n] == 1) { return 0; }
int j = m + 1;
int i = n + 1;
for (; i < 8 && j<8; i++, j++)
if (a[j][i] == 1) { return 0; }
i = n - 1;
j = m - 1;
for (; i >= 0 && j >= 0; i--, j--)
if (a[j][i] == 1) { return 0; }
i = n + 1;
j = m - 1;
for (; i <8 && j >= 0; i++, j--)
if (a[j][i] == 1) { return 0; }
i = n - 1;
j = m + 1;
for (; j <8 && i >= 0; i--, j++)
if (a[j][i] == 1) { return 0; }
return 1;
}
void move03(int(*b)[8], int m)
{
int a[8][8];
int i = 0, j = 0;
for (; i < 8; i++)
for (j = 0; j < 8; j++)
a[i][j] = b[i][j];
if (m == 8)
{
k++;
cout << k << endl;
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
cout << a[i][j] << " ";
cout << endl;
cout << endl;
}
}
else
{
for (int j = 0; j < 8; j++)
{
if (safe(a, m, j))
{
a[m][j] = 1;
move03(a, m + 1); //原理:当发现a[m][j]可以满足条件时候,move函数进入m+1行,到第八行打印结果。
a[m][j] = 0; //算法难点在这于:当第j个满足要求时,我们要尝试第j+1个,此时记得把第j个置零,否则第m行肯定不安全。
}
}
}
}
int main()
{
int a[8][8] = { { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 } };
move03(a, 0);
cout << "一共"<<k <<"种"<< endl;
cin.get();
return 0;
}
递归调用 汉诺塔问题 八皇后问题 c++
最新推荐文章于 2024-04-15 14:35:30 发布