제출 #242856

#제출 시각아이디문제언어결과실행 시간메모리
242856oolimryNautilus (BOI19_nautilus)C++14
100 / 100
188 ms888 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 501;
bitset<MAXN> cur[MAXN];
bitset<MAXN> temp[MAXN];
bitset<MAXN> walls[MAXN];

int main(){
	ios_base::sync_with_stdio(false); cin.tie(0);
	
	int rows, cols, K; cin >> rows >> cols >> K;
	
	for(int r = 0;r < rows;r++){
		string s; cin >> s;
		for(int c = 0;c < cols;c++){
			int bit = (s[c] == '.');
			cur[r][c] = bit;
			walls[r][c] = bit;
		}
	}
	
	string command; cin >> command;
	for(char c : command){
		
		
		if(c == 'W'){
			for(int r = 0;r < rows;r++) cur[r] >>= 1;
		}
		if(c == 'E'){
			for(int r = 0;r < rows;r++) cur[r] <<= 1;
		}
		if(c == 'N'){
			for(int r = 0;r < rows-1;r++) cur[r] = cur[r+1];
			for(int c = 0;c < cols;c++) cur[rows-1][c] = 0;
		}
		if(c == 'S'){
			for(int r = rows-1;r >= 1;r--) cur[r] = cur[r-1];
			for(int c = 0;c < cols;c++) cur[0][c] = 0;
		}
		if(c == '?'){
			for(int r = 0;r < rows;r++) temp[r] = cur[r];
			
			for(int r = 0;r < rows;r++){
				cur[r] = (temp[r] << 1) | (temp[r] >> 1);
				if(r != 0) cur[r] |= temp[r-1];
				if(r != rows-1) cur[r] |= temp[r+1];
			}
		}
		
		
		for(int r = 0;r < rows;r++) cur[r] &= walls[r];
		
	}
	
	int ans = 0;
	for(int r = 0;r < rows;r++){
		for(int c = 0;c < cols;c++){
			ans += cur[r][c];
		}
	}
	
	cout << ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...