for(iTmp=0 ; iTmp < iMax; iTmp++) 串中最长的连续数字串赋值给结果 串
// 将原字符
strResult[iTmp] = strSource[iHead++]; strResult[iTmp]='\\0'; return iMax; 数字的最大长度 }
int main(int argc, char* argv[]) {
char strSource[]=\strResult[sizeof(strSourc e)];
printf(\GetSubString(strSource, strResult), strResult, strSource); }
12、四个工人,四个任务,每个人做不同的任务需要的时间不同,求任务分配的最优方案。
(2005年5月29日全国计算机软件资格水平考试——软件设计师的算法题)。 #include \#define N 4
// 返回连续
int Cost[N][N] = { {2, 12, 5, 32}, // 行号:任务
序号,列号:工人序号
{8, 15, 7, 11}, 值表示这个任务由不同工人完成所需 要的时间
{24, 18, 9, 6}, {21, 1, 8, 28}}; int MinCost=1000;
int Task[N], TempTask[N], Worker[N]; void Assign(int k, int cost) {
if(k == N) {
MinCost = cost;
// 每行元素
for(int i=0; i TempTask[i] = Task[i]; } else { for(int i=0; i if(Worker[i]==0 && cost+Cost[k][i] < MinCost) { // 为提高效率而进行剪枝 } Worker[i] = 1; Task[k] = i; Assign(k+1, cost+Cost[k][i]); Worker[i] = 0; Task[k] = 0; } } } int main(int argc, char* argv[]) { Assign(0, 0); printf(\最佳方案总费用=%d\\n\for(int i=0; i /* 输出最佳方案 */ printf(\任务%d由工人%d来做:%d\\n\ TempTask[i], Cost[i][TempTask[i]]); } 13、八皇后问题,输出了所有情况,不过有些结果只是旋转了90度而已。(回溯算法的典型 例题,是数据结构书上算法的具体实现,大家都亲自动手写过这个程序吗?) #define N 8 int Board[N][N]; int Valid(int i, int j) { 否有效 int k = 1; for(k=1; i>=k && j>=k;k++) if(Board[i-k][j-k]) return 0; // 判断下棋位置是 for(k=1; i>=k;k++) } if(Board[i-k][j]) return 0; for(k=1; i>=k && j+k if(Board[i-k][j+k]) return 0; return 1; void Trial(int i, int n) { 置 if(i == n) { // 寻找合适下棋位 for(int k=0; k printf(\ for(int m=0; m printf(\ printf(\ } else { } for(int j=0; j Board[i][j] = 1; if(Valid(i,j)) Trial(i+1, n); Board[i][j] = 0; } int main(int argc, char* argv[]) { } 14、实现strstr功能,即在父串中寻找子串首次出现的位置。(笔试中常让面试者实现标准 库中的一些函数) char * strstring(char *ParentString, char *SubString) { char *pSubString, *pPareString; for(char *pTmp=ParentString; *pTmp; pTmp++) { pSubString = SubString; pPareString = pTmp; Trial(0, N); while(*pSubString == *pPareString && *pSubString != '\\0') { } int main(int argc, char* argv[]) { } return NULL; } if(*pSubString == '\\0') return pTmp; pSubString++; pPareString++;