以指派问题为例写的一个用循环实现dfs的方法.(gcc)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
int n, m;
while(~scanf("%d%d",&n, &m))
{
int Eft[n][m], i, j;
for(i = 0; i < n; ++i) {
for(j = 0; j < m; ++j) {
scanf("%d", &Eft[i][j]);
}
} //input efficiency table.
int Asg[n]; //assignment table.
int AsgRec[m]; //assignment status record.
memset(Asg, 0, sizeof(Asg));
memset(AsgRec, 0, sizeof(AsgRec));
//init.
int maxef = 0,tef = 0;
i = 0; //dfs
while(i>=0)
{
while(Asg[i] < m && AsgRec[Asg[i]])
++Asg[i];
if(Asg[i] < m)
{
AsgRec[Asg[i]] = 1;
tef += Eft[i][Asg[i]];
/*for problems that need to cut brunches,
the according steps can be placed here.*/
++i;
if(i < n)
{
Asg[i] = 0;
continue;
}
else
{
//summary.
if(tef > maxef) //renew data.
{
maxef = tef;
system("clear");
for(j = 0; j < n; ++j)
{
int k;
for(k = 0; k < m; ++k)
{
printf(" %c", k==Asg[j]?'$':'~');
}
putchar('\n');
}
printf("tef = %d.\n", tef);
}
--i;
tef -= Eft[i][Asg[i]];
AsgRec[Asg[i]] = 0;
++Asg[i];
continue;
}
}
else
{
--i;
if(i >= 0)
{
tef -= Eft[i][Asg[i]];
AsgRec[Asg[i]] = 0;
++Asg[i];
}
continue;
}
} //dfs while-loop.
printf("the maximum total efficiency is: %d.\n", maxef);
}//external while-loop.
return 0;
}//main.