#include <bits/stdc++.h>

using namespace std;

#define  MOD 1000000007
template <class t1, class t2>
inline void add(t1 &a, t2 b, int mod = -1) {
  if(mod == -1) mod = MOD;
  a += b;
  while(a >= mod) a -= mod;
  while(a < 0) a += mod;
}

const int maxn = 330;
int n;
int orig[maxn * 2];
int status[maxn * 2];
int dp[2][maxn][maxn];

int main() {
  scanf("%d", &n);
  int free = 0;
  for (int i = 0; i < n * 2; i++) {
    scanf("%d", orig + i);
    orig[i]--;
    if (i % 2) {
      if (orig[i - 1] != -2 && orig[i] != -2) {
        status[orig[i - 1]] = status[orig[i]] = 2;
      } else if (orig[i - 1] != -2 || orig[i] != -2) {
        status[orig[i - 1] + orig[i] + 2] = 1;
      } else {
        free++;
      }
    }
  }

  memset(dp, 0, sizeof(dp));
  int now = 0, nxt = 1;
  dp[now][0][0] = 1;
  for (int i = n * 2 - 1; i >= 0; i--) if (status[i] != 2) {
    memset(dp[nxt], 0, sizeof(dp[nxt]));
    for (int j = 0; j <= min(i, n * 2 - i) + 1; j++)
      for (int k = 0; k + j <= min(i, n * 2 - i) + 1; k++) if (dp[now][j][k]){
        if (j) add(dp[nxt][j - 1][k], dp[now][j][k]);
        if (status[i] == 0) {
          add(dp[nxt][j + 1][k], dp[now][j][k]);
          if (k) add(dp[nxt][j][k - 1], 1ll * dp[now][j][k] * k % MOD);
        } else {
          add(dp[nxt][j][k + 1], dp[now][j][k]);
        }
      }
    swap(now, nxt);
  }
  long long ans = 1;
  for (int i = 1; i <= free; i++) ans = ans * i % MOD;
  cout << ans * dp[now][0][0] % MOD << endl;

  return 0;
}
