大概題意
在一個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;
}