제출 #496446

#제출 시각아이디문제언어결과실행 시간메모리
496446ZielNautilus (BOI19_nautilus)C++17
100 / 100
181 ms160588 KiB
/**
 * LES GREATEABLES BRO TEAM
**/

#include <bits/stdc++.h>

using namespace std;

using ll = long long;
#define sz(x) (int)x.size()
const bool FLAG = false;
void setIO(const string &f = "");

#define int ll

bitset<510> dp[5010][510];

void solve() {
    int r, c, m;
    cin >> r >> c >> m;
    vector<vector<char>> a(r + 1, vector<char>(c + 1));
    for (int i = 1; i <= r; i++) {
    	for (int j = 1; j <= c; j++) {
    		cin >> a[i][j];
    	}
    }
    string s;
    cin >> s;
    auto in_frame = [r, c](int x, int y) -> bool {
    	return x >= 1 && x <= r && y >= 1 && y <= c;
    };

    for (int i = 1; i <= r; i++) {
    	for (int j = 1; j <= c; j++) {
    		if (a[i][j] == '.')
	    		dp[0][i][j] = 1;
    	}
    }

    /*for (int k = 0; k <= m; k++) {
		for (int i = 1; i <= r; i++) {
			for (int j = 1; j <= c; j++) {
				cout << dp[k][i][j] << ' ';
			}
			cout << '\n';
		}
		cout << "\n\n";
	}
	cout << "--------------------------------------------------------------------------\n";
	*/
    for (int k = 1; k <= m; k++) {
    	for (int i = 1; i <= r; i++) {
    		if (s[k - 1] == '?') {
    			dp[k][i] |= (dp[k - 1][i - 1] & dp[0][i]);
    			dp[k][i] |= (dp[k - 1][i + 1] & dp[0][i]);
    			dp[k][i] |= ((dp[k - 1][i] << 1) & dp[0][i]);
    			dp[k][i] |= ((dp[k - 1][i] >> 1) & dp[0][i]);
    		} else if (s[k - 1] == 'N') {
    			dp[k][i] |= (dp[k - 1][i + 1] & dp[0][i]);
    		} else if (s[k - 1] == 'S') {
    			dp[k][i] |= (dp[k - 1][i - 1] & dp[0][i]);
    		} else if (s[k - 1] == 'E') {
    			dp[k][i] |= ((dp[k - 1][i] << 1) & dp[0][i]);
    		} else {
    			dp[k][i] |= ((dp[k - 1][i] >> 1) & dp[0][i]);
    		}
    	}
    }

/*
	for (int k = 0; k <= m; k++) {
		for (int i = 1; i <= r; i++) {
			for (int j = 1; j <= c; j++) {
				if (k == 0) {
					if (a[i][j] == '.')
						dp[i][j][k] = true;
				} else {
					if (a[i][j] == '#') {
						dp[i][j][k] = false;
						continue;
					}
					if (s[k - 1] == '?') {
						if (in_frame(i - 1, j))
							dp[i][j][k] |= dp[i - 1][j][k - 1];
						if (in_frame(i + 1, j))
							dp[i][j][k] |= dp[i + 1][j][k - 1];
						if (in_frame(i, j - 1))
							dp[i][j][k] |= dp[i][j - 1][k - 1];
						if (in_frame(i, j + 1))
							dp[i][j][k] |= dp[i][j + 1][k - 1];
					} else if (s[k - 1] == 'N' && in_frame(i + 1, j)) {
						dp[i][j][k] |= dp[i + 1][j][k - 1];
					} else if (s[k - 1] == 'S' && in_frame(i - 1, j)) {
						dp[i][j][k] |= dp[i - 1][j][k - 1];
					} else if (s[k - 1] == 'E' && in_frame(i, j - 1)) {
						dp[i][j][k] |= dp[i][j - 1][k - 1];
					} else if (s[k - 1] == 'W' && in_frame(i, j + 1)) {
						dp[i][j][k] |= dp[i][j + 1][k - 1];
					}
				}
			}
		}
	}        */
/*
	for (int k = 0; k <= m; k++) {
		for (int i = 1; i <= r; i++) {
			for (int j = 1; j <= c; j++) {
				cout << dp[k][i][j] << ' ';
			}
			cout << '\n';
		}
		cout << "\n\n";
	}*/

	int ans = 0;
	for (int i = 1; i <= r; i++) {
		for (int j = 1; j <= c; j++) {
			ans += dp[m][i][j];
		}
	}
	cout << ans;
}

signed main() {
    setIO();
    
    int tt = 1;
    if (FLAG) {
    	cin >> tt;
    }
    while (tt--) {
    	solve();
    }
    
    return 0;
}

void setIO(const string &f) {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    if (fopen((f + ".in").c_str(), "r")) {
        freopen((f + ".in").c_str(), "r", stdin);
        freopen((f + ".out").c_str(), "w", stdout);
    }
}

컴파일 시 표준 에러 (stderr) 메시지

nautilus.cpp: In function 'void solve()':
nautilus.cpp:29:10: warning: variable 'in_frame' set but not used [-Wunused-but-set-variable]
   29 |     auto in_frame = [r, c](int x, int y) -> bool {
      |          ^~~~~~~~
nautilus.cpp: In function 'void setIO(const string&)':
nautilus.cpp:142:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  142 |         freopen((f + ".in").c_str(), "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
nautilus.cpp:143:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  143 |         freopen((f + ".out").c_str(), "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...