#include<bits/stdc++.h>
using namespace std;
#define nn 307
#define mod 1000000007
#define ll long long
ll dp[2][nn][nn];
int val[nn*2];int n;
ll f[2*nn],rf[2*nn];
ll qpow(ll x,ll y)
{
	ll res=1;
	while(y)
	{
		if(y&1) res=res*x%mod;
		x=x*x%mod;y=y/2;
	}
	return res;
}

void add(ll &x,ll y)
{
	x=(x+y)%mod;
}
int del[nn*2],vis[nn*2];
int main()
{
	f[0]=1;rf[0]=1;for(int i=1;i<nn*2;i++) f[i]=f[i-1]*i%mod,rf[i]=qpow(f[i],mod-2);
	scanf("%d",&n);
	for(int i=1;i<=n+n;i++) scanf("%d",&val[i]);
	
	int t1=0,t0=0;
	for(int i=1;i<=n+n;i+=2) 
	{
		if(val[i]>0 and val[i+1]>0) del[val[i]]=del[val[i+1]]=1;
		else if(val[i]>0 or val[i+1]>0) vis[max(val[i],val[i+1])]=1;
		else t0++;
	}
	
	int now=0;
	dp[0][0][0]=1;
	for(int i=n+n;i>=1;i--) if(!del[i])
	{
		now^=1;memset(dp[now],0,sizeof dp[now]);
		if(!vis[i])
		for(int j=0;j<nn;j++)
			for(int k=0;k<nn;k++)
				if(dp[now^1][j][k])
				{
					if(j+1<nn)add(dp[now][j+1][k],dp[now^1][j][k]);
					if(j)add(dp[now][j-1][k],dp[now^1][j][k]);
					if(k)add(dp[now][j][k-1],dp[now^1][j][k]*k);
				}
		if(vis[i])
		for(int j=0;j<nn;j++)
			for(int k=0;k<nn;k++)
				if(dp[now^1][j][k])
				{
					if(k+1<nn)add(dp[now][j][k+1],dp[now^1][j][k]);
					if(j)add(dp[now][j-1][k],dp[now^1][j][k]);
				}
	}
	cout<<dp[now][0][0]*f[t0]%mod;
	
	return 0;
}