#include <iostream>
#include <queue>
using namespace std;

typedef pair<long long, long long > P;
typedef pair<long long, P>P2;
#define INF 10000000000000


int main() {
	while (true) {
		int b[2][105] = { 0 };
		int n;
		long long dp[2][105] = { 0 };
		cin >> n;
		if (n == 0) return 0;
		for (int i = 0; i < 2; i++) {
			for (int j = 0; j < n; j++) {
				cin >> b[i][j];
			}
		}
		for (int i = 0; i < 105; i++) {
			dp[0][i] = INF;
			dp[1][i] = INF;
		}
		dp[0][0] = 0;
		dp[1][0] = 0;
		queue<P2>que;
		que.push(P2(0, P(0, 0)));
		que.push(P2(0, P(1, 0)));
		while (!que.empty()) {
			P2 p2 = que.front();
			que.pop();
			P p = p2.second;
			if (p2.first > dp[p.first][p.second]) continue;
			if (b[p.first][p.second] == 0) {
				if (dp[(p.first + 1) % 2][p.second] > p2.first + 1) {
					dp[(p.first + 1) % 2][p.second] = p2.first + 1;
					que.push(P2(p2.first + 1, P((p.first + 1) % 2, p.second)));
				}
				if (dp[(p.first + 1) % 2][p.second + 1] > p2.first + 1) {
					dp[(p.first + 1) % 2][p.second + 1] = p2.first + 1;
					que.push(P2(p2.first + 1, P((p.first + 1) % 2, p.second + 1)));
				}
				if (dp[(p.first + 1) % 2][p.second + 2] > p2.first + 1) {
					dp[(p.first + 1) % 2][p.second + 2] = p2.first + 1;
					que.push(P2(p2.first + 1, P((p.first + 1) % 2, p.second + 2)));
				}
			}
			if (b[p.first][p.second] == 1) {
				int i = 0;
				for (i = 0;; i++) {
					if (b[p.first][p.second + i] != 1) break;
				}
				p.second += i - 1;
				if (p2.first > dp[p.first][p.second]) {
					continue;
				}
				dp[p.first][p.second] = p2.first;
				if (dp[(p.first + 1) % 2][p.second] > p2.first + 1) {
					dp[(p.first + 1) % 2][p.second] = p2.first + 1;
					que.push(P2(p2.first + 1, P((p.first + 1) % 2, p.second)));
				}
				if (dp[(p.first + 1) % 2][p.second + 1] > p2.first + 1) {
					dp[(p.first + 1) % 2][p.second + 1] = p2.first + 1;
					que.push(P2(p2.first + 1, P((p.first + 1) % 2, p.second + 1)));
				}
				if (dp[(p.first + 1) % 2][p.second + 2] > p2.first + 1) {
					dp[(p.first + 1) % 2][p.second + 2] = p2.first + 1;
					que.push(P2(p2.first + 1, P((p.first + 1) % 2, p.second + 2)));
				}
			}
			if (b[p.first][p.second] == 2) {
				int i = 0;
				for (i = 0;; i++) {
					if (b[p.first][p.second - i] != 2) break;
				}
				p.second -= i;
				if (dp[p.first][p.second] < p2.first) continue;
				dp[p.first][p.second] = p2.first;
				if (dp[(p.first + 1) % 2][p.second] > p2.first + 1) {
					dp[(p.first + 1) % 2][p.second] = p2.first + 1;
					que.push(P2(p2.first + 1, P((p.first + 1) % 2, p.second)));
				}
				if (dp[(p.first + 1) % 2][p.second + 1] > p2.first + 1) {
					dp[(p.first + 1) % 2][p.second + 1] = p2.first + 1;
					que.push(P2(p2.first + 1, P((p.first + 1) % 2, p.second + 1)));
				}
				if (dp[(p.first + 1) % 2][p.second + 2] > p2.first + 1) {
					dp[(p.first + 1) % 2][p.second + 2] = p2.first + 1;
					que.push(P2(p2.first + 1, P((p.first + 1) % 2, p.second + 2)));
				}
			}

		}
		int ans = min(dp[0][n - 1], dp[1][n - 1]);
		if (ans == INF) {
			cout << "NA" << endl;
		}
		else {
			if (dp[0][n - 1] != INF && dp[1][n - 1] == INF && b[0][n - 1] == 2) cout << "NA" << endl;
			else if (dp[0][n - 1] == INF && dp[1][n - 1] != INF && b[1][n - 1] == 2) cout << "NA" << endl;
			else if (b[0][n - 1] == 2 && b[1][n - 1] == 2) cout << "NA" << endl;
			else cout << ans << endl;
		}
	}
	return 0;
}


Measured memory_bytes: 3084