1. 程式人生 > >POJ-1680(遞迴模擬)

POJ-1680(遞迴模擬)

分析:父程序wait會等到子程序執行完成之後才繼續下一步,每個程序都執行相同的程式碼,剛好和遞迴函式呼叫的方式一致。

需要注意的是【ProcessID==0】每個子程序僅列印一次,對應到遞迴呼叫中,就是進入函式時列印一次。

由於題目只要求獲得列印的某一行,這裡可以優化遞迴的退出條件,不需要執行到底:發現當前列印的是目標行就退出整個遞迴。


#include <cstdio>

const int kRoot = 1000;
int N, K, P;

bool dfs(int i, int a, int p)
{
	if(p != kRoot){
		if(--K == 0){
			printf("Process ID=%d, A=%d\n", p, a);
			return true;
		}
	}
	while(i < N){
		if(--K == 0){
			printf("Loop %d: Process ID=%d\n", i, p);
			return true;
		}
		a += 7;
		if(dfs(++i, a, ++P)) return true;
	}
	return false;
}

int main()
{
	int t;
	for(scanf("%d", &t); t--; ){
		scanf("%d%d", &N, &K);
		dfs(0, 0, P = kRoot);
	}
	return 0;
}