回溯法:N后问题

原创 2013年12月05日 11:11:38
#include <iostream>
#include <cstdio>


using namespace std;


#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define MAXSIZE 10
#define INF 999999999


struct Job_Info
{
int t1, t2;
}job[MAXSIZE];
int n; //作业数量
int solu[MAXSIZE]; //调度次序
int optimalValue; //最优值
int optimalSolu[MAXSIZE]; //最优解


void Swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}


//time1,time2分别为机器1和机器2的完成处理时间
//totalTime为已完成作业的时间和
void Backtrack(int k, int time1, int time2, int totalTime)
{
int i;
if (k >= n)
{
for (i = 0; i < n; i++)
{
optimalSolu[i] = solu[i];
}
optimalValue = totalTime;
}
else
{
for (i = k; i < n; i++)
{
//计算完成第i个任务后,两机器的时间
int nextTime1 = time1 + job[solu[i]].t1;
int nextTime2 = MAX(nextTime1, time2) + job[solu[i]].t2;
//已完成作业的时间和是否小于最优值
if (totalTime + nextTime2 < optimalValue)
{
Swap(solu[k], solu[i]);
Backtrack(k+1, nextTime1, nextTime2, totalTime+nextTime2);
Swap(solu[k], solu[i]);
}
}
}
}


int main(void)
{
int i;
for (i = 0; i < MAXSIZE; i++)
{
solu[i] = i;
}
while (scanf("%d", &n) != EOF)
{
for (i = 0; i < n; i++)
{
scanf("%d%d", &job[i].t1, &job[i].t2);
}


optimalValue = INF;
Backtrack(0, 0, 0, 0);


printf("optimal value: %d\n", optimalValue);
printf("optimal solution: ");
for (i = 0; i < n-1; i++)
{
printf("%d ", optimalSolu[i]+1);
}
printf("%d\n", optimalSolu[i]+1);
}
return 0;
}

回溯法解决N皇后问题(java实现)

回溯法解决N皇后问题(java实现)
  • qq_22222499
  • qq_22222499
  • 2017年04月30日 13:26
  • 567

回溯法解决n后问题

问题的解空间 用回溯法解问题时,明确定义问题的解空间。问题的解空间至少应包含问题的一个(最优)解。 定义了问题的解空间后,还应将解空间很好地组织起来,使得能用回溯法方便地搜索整个解空间。通常将解空间...
  • a1031616423
  • a1031616423
  • 2016年03月19日 17:32
  • 1461

回溯法及N皇后问题

回溯法是一种系统地搜索问题解答的方法。在搜索的过程中尝试找到问题的解,如果发现找不到了,就退一步,往上回溯(剪枝过程)。对于许多复杂问题和大规模问题都可以使用回溯法。 回溯法的基本思想是按照深度优先...
  • charles1e
  • charles1e
  • 2016年06月12日 15:55
  • 1171

回溯法--------n后问题

n后问题: 1.问题描述: 在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一斜线上的棋子。n后问题等价于在n×n格的棋盘上放置n个皇后,任何2个皇...
  • cjq950918
  • cjq950918
  • 2017年05月10日 09:47
  • 542

回溯法解决N皇后问题

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同...
  • wuqiuping695
  • wuqiuping695
  • 2015年08月16日 17:06
  • 864

N皇后问题与回溯法

八皇后问题,快三个月了,原来不会写现在还是不会,感觉递归还是不理解,每次看别人的代码都要想一下,更不讲自己写了 这里明显用到了回溯法,这种递归我看看是没问题的,可以说比较简单,但自己写就难了 回溯...
  • SeasonJoe
  • SeasonJoe
  • 2015年12月17日 22:42
  • 1193

回溯法:八皇后问题

八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后...
  • T_27080901
  • T_27080901
  • 2015年05月17日 12:24
  • 3741

N后问题——回溯法求解

题目:在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。 对于给定的N,求出有多少种合法的放置方法。算法分析与设计...
  • qq_26850187
  • qq_26850187
  • 2016年12月25日 21:59
  • 286

回溯法 n皇后 python 解法一

输出所有解global N N = 4 def printSolution(board): for i in range(N): for j in range(N): ...
  • normol
  • normol
  • 2017年11月28日 14:32
  • 112

【算法分析】回溯法解八皇后问题(n皇后问题)

回溯法解题思路: (1)针对所给问题,定义问题的解空间;    (2)确定易于搜索的解空间结构;    (3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。八皇后问题: 八...
  • sinat_33052719
  • sinat_33052719
  • 2016年05月18日 21:26
  • 2551
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:回溯法:N后问题
举报原因:
原因补充:

(最多只允许输入30个字)