【華爲機試題解】奧特曼打怪獸

大概題意

在一個N*N的正方形區域,每個小格可能有三種狀態
值爲0,正常可通過
值爲1,奧特曼可通過,同時還可以消滅怪獸,消滅後值變爲0,消滅怪獸數量+1
值爲-1,有大石頭,奧特曼無法通過

奧特曼需要先從上往下走,這個過程只能向下或者向右,到達右下角後,再從下往上走,這個過程只能向左或向上。需要找到奧特曼可以消滅怪獸的最大數量

輸入:
第一行一個N,表示N的正方形區域的大小,N不超過50
第二行到N+1行,每一行N個數,表示正方形區域的情況

輸出:
奧特曼可以消滅怪獸的最大數量

思路

1、和以前的動態規劃很像,但是好像是不能用動態規劃。(leetcode 741打臉了)
2、回溯,本題給C++的時間是2秒,一般都是1秒,說明可以走高複雜度策略

心情

考試的時候沒寫出來,考完後寫出來了,就是這種心情

代碼

#include <bits/stdc++.h>
using namespace std;
const int MAX = 60;

void walkup(int gird[MAX][MAX], int i, int j, int N, int tempAns, int& trueAns){
	if(i == 0 && j == 0){
		if(trueAns < tempAns){
			trueAns = tempAns;
		}
	}
	else if(i == 0){
		if(gird[i][j] == 0){
			walkup(gird, i, j-1, N, tempAns, trueAns);
		}
		else if(gird[i][j] == 1){
			gird[i][j] = 0;
			walkup(gird, i, j-1, N, tempAns+1, trueAns);
			gird[i][j] = 1;
		}
	}
	else if(j == 0){
		if(gird[i][j] == 0){
			walkup(gird, i-1, j, N, tempAns, trueAns);
		}
		else if(gird[i][j] == 1){
			gird[i][j] = 0;
			walkup(gird, i, j-1, N, tempAns+1, trueAns);
			gird[i][j] = 1;
		}
	}
	else{
		if(gird[i][j] == 0){
			walkup(gird, i-1, j, N, tempAns, trueAns);
			walkup(gird, i, j-1, N, tempAns, trueAns);
		}
		else if(gird[i][j] == 1){
			gird[i][j] = 0;
			walkup(gird, i-1, j, N, tempAns+1, trueAns);
			walkup(gird, i, j-1, N, tempAns+1, trueAns);
			gird[i][j] = 1;
		}
	}
}


void walkdown(int gird[MAX][MAX], int i, int j, int N, int tempAns, int& trueAns){
	if(i == N-1 && j == N-1){
		if(gird[i][j] == 0){
			walkup(gird, i-1, j, N, tempAns, trueAns);
			walkup(gird, i, j-1, N, tempAns, trueAns);
		}
		else if(gird[i][j] == 1){
			walkup(gird, i-1, j, N, tempAns+1, trueAns);
			walkup(gird, i, j-1, N, tempAns+1, trueAns);
		}
	}
	else if(i == N-1){
		if(gird[i][j] == 0){
			walkdown(gird, i, j+1, N, tempAns, trueAns);
		}
		else if(gird[i][j] == 1){
			gird[i][j] = 0;
			walkdown(gird, i, j+1, N, tempAns+1, trueAns);
			gird[i][j] = 1;
		}
	}
	else if(j == N-1){
		if(gird[i][j] == 0){
			walkdown(gird, i+1, j, N, tempAns, trueAns);
		}
		else if(gird[i][j] == 1){
			gird[i][j] = 0;
			walkdown(gird, i+1, j, N, tempAns+1, trueAns);
			gird[i][j] = 1;
		}
	}
	else{
		if(gird[i][j] == 0){
			walkdown(gird, i+1, j, N, tempAns, trueAns);
			walkdown(gird, i, j+1, N, tempAns, trueAns);
		}
		else if(gird[i][j] == 1){
			gird[i][j] = 0;
			walkdown(gird, i+1, j, N, tempAns+1, trueAns);
			walkdown(gird, i, j+1, N, tempAns+1, trueAns);
			gird[i][j] = 1;
		}
	}
}

int main()
{
	int gird[MAX][MAX];
	int dp[MAX][MAX];
	for(int i = 0; i < MAX; i++){
		for(int j = 0; j < MAX; j++){
			gird[i][j] = 0;
			dp[i][j] = 0;
		}
	}
	int N;
	cin >> N;
	for(int i = 0; i < N; i++){
		for(int j = 0; j < N; j++){
			cin >> gird[i][j];
		}
	}
	
	// 從上往下走
//	for(int i = 0; i < N; i++){
//		for(int j = 0; j < N; j++){
//			if(gird[i][j] == 0){
//				dp[i][j] = dp[i][j-1] > dp[i-1][j] ? dp[i][j-1] : dp[i-1][j];
//			}
//			else if(gird[i][j] == 1){
//				dp[i][j] = dp[i][j-1] > dp[i-1][j] ? dp[i][j-1] : dp[i-1][j];
//				dp[i][j]++;
//			}
//			else{
//				dp[i][j] = -1;
//			}
//		}
//	}
	
	int tempAns = 0;
	int trueAns = 0;
	walkdown(gird, 0, 0, N, tempAns, trueAns);
	cout << trueAns << endl;
	
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章