#include<bits/stdc++.h>
const int N=602,M=1000000007;
using namespace std;
int n,nn,x,y,op[N],f[N][N],g[N][N],fac,tp;
inline void tr(int x,int y){
	if(x>=0&&y>=0)
	(f[x][y]+=tp)>=M?f[x][y]-=M:0;
}
int main(){
	scanf("%d",&nn),f[0][0]=1;
	for(int i=0;i<nn;i++){
		scanf("%d%d",&x,&y);
		x=max(x,0),y=max(y,0);
		if(x&&y)op[x]=op[y]=2;
		else if(x||y)op[x]=op[y]=1;
		else f[0][0]=1ll*f[0][0]*++fac%M;
	}
	for(int i=1;i<=nn*2;i++)
	if(op[i]<2)op[n++]=op[i];
	for(int i=0;i<n/2;i++)swap(op[i],op[n-i-1]);
	for(int i=0;i<n;i++){
		for(int j=0;j<=i;j++)
		for(int k=0;j+k<=i&&j+k<=n-i;k++)
		g[j][k]=f[j][k],f[j][k]=0;
		for(int j=0;j<=i;j++)
		for(int k=0;j+k<=i&&j+k<=n-i;k++)
		if(g[j][k]){
			tp=g[j][k];
			tr(j+!op[i],k+op[i]);
			tr(j-1,k);
			if(!op[i])
			tp=1ll*tp*k%M,tr(j,k-1);
		}
	}
	printf("%d",f[0][0]);
}