C++实现回溯

#include <stdio.h>
int i=0;
void dian(float a,float b,float c,float d,int j);  /*回朔声明*/
void jia(float a,float b,float c,float d,int j)   /*进行加的运算*/
  {if ((a*b!=0)&&(j<4)&&(i!=1))
     {dian(a+b,c,d,0,j+1);
     if (i==1)
 printf("%g=%g+%g\n",a+b,a,b);}
  }
void jian(float a,float b,float c,float d,int j)  /*进行减的运算*/
  {if ((a*b!=0)&&(j<4)&&(i!=1))
     {dian(a-b,c,d,0,j+1);

      dian(b-a,c,d,0,j+1);
     if (i==1)
       printf("%g=%g-%g\n",a-b,a,b);}
  }
void cheng(float a,float b,float c,float d,int j)  /*进行乘的运算*/
  {if ((a*b!=0)&&(j<4)&&(i!=1))
     {dian(a*b,c,d,0,j+1);
     if (i==1)
       printf("%g=%g*%g\n",a*b,a,b);}
  }
void chu(float a,float b,float c,float d,int j)   /*进行除的运算*/
  {if ((a*b!=0)&&(j<4)&&(i!=1))
     {dian(a/b,c,d,0,j+1);
     if (i==1)
       printf("%g=%g/%g\n",a/b,a,b);}
  }
void dian(float a,float b,float c,float d,int j)  /*进行回朔*/
  {
   jia(a,b,c,d,j);
   cheng(a,b,c,d,j);
   jian(a,d,b,c,j);
   chu(a,d,b,c,j);
   jia(a,c,b,d,j);
   cheng(a,c,b,d,j);
   jia(a,d,c,b,j);
   cheng(a,d,c,b,j);
   jian(a,b,c,d,j);
   chu(a,b,c,d,j);
   jian(b,a,c,d,j);
   chu(b,a,c,d,j);
   jian(d,a,b,c,j);
   chu(d,a,b,c,j);
   jian(a,c,b,d,j);
   chu(a,c,b,d,j);  /*进行交换(这里可以用程序嵌套简化)*/
   if ((j==3)&&(a+b+c+d==24))   /*运算的结果是否是24,如果为24将记号改为1*/
       i=1;
  }
void main()
  {float a,b,c,d;
   printf("input 4 num");
   scanf("%f%f%f%f",&a,&b,&c,&d);
   if (i==0) dian(a,b,c,d,0);
   if (i==0) dian(b,a,c,d,0);
   if (i==0) dian(c,b,a,d,0);
   if (i==0) dian(d,a,b,c,0);
  }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用C++实现回溯法求解马步问题的示例代码: ```c++ #include <iostream> using namespace std; const int N = 10; int dx[8] = { 1, 2, 2, 1, -1, -2, -2, -1 }; int dy[8] = { 2, 1, -1, -2, -2, -1, 1, 2 }; int board[N][N]; int n; bool check(int x, int y) { // 判断坐标是否越界 if (x < 0 || x >= n || y < 0 || y >= n) return false; // 判断该位置是否已经被访问过 if (board[x][y] != -1) return false; return true; } bool dfs(int x, int y, int step) { board[x][y] = step; if (step == n * n) return true; for (int i = 0; i < 8; i++) { int nx = x + dx[i]; int ny = y + dy[i]; if (check(nx, ny)) { if (dfs(nx, ny, step + 1)) return true; } } board[x][y] = -1; return false; } int main() { cin >> n; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { board[i][j] = -1; } } dfs(0, 0, 1); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cout << board[i][j] << " "; } cout << endl; } return 0; } ``` 在上述代码中,我们首先定义了一个`check()`函数,用来判断当前位置是否可以走。然后,我们定义了一个`dfs()`函数,用来实现回溯法的搜索过程。在`dfs()`函数中,我们首先将当前位置标记为已访问,然后按照马的移动规则依次尝试走下一步。如果走到了最后一个格子,那么表示已经找到了一条路径,返回`true`。如果没有找到,就需要回溯到上一个位置,重新选择下一步走向,直到找到一条路径为止。最后,我们输出找到的路径。 在主函数中,我们首先读入棋盘大小`n`,然后将棋盘上所有的位置初始化为-1,代表未访问过。接着,我们调用`dfs()`函数开始搜索,从$(0,0)$位置开始遍历,遍历的步数从1开始计算。最后,我们输出遍历的结果。 以上就是使用C++实现回溯法求解马步问题的示例代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值