#include<bits/stdc++.h>
using namespace std;
char mp[10][10];
int r[100][3]; // 存放*的坐标
int n,cnt,num;
// 判断在x,y位置放置字符k 是否OK
bool is_ok(int x,int y,char k){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==x&&mp[i][j]==k)return false;
if(j==y&&mp[i][j]==k)return false;
if(i-j==x-y&&mp[i][j]==k)return false;
if(i+j==x+y&&mp[i][j]==k)return false;
}
}
return true;
}
void prt(){
cout<<"---------------"<<endl;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<mp[i][j];
}
cout<<endl;
}
}
// 向以 下标为 k 的 r数组的坐标 的方格 填数
void dfs(int k){
for(int i=1;i<=n;i++){
if(is_ok(r[k][1],r[k][2],i+'0')){
mp[r[k][1]][r[k][2]]=i+'0';
if(k==num){
cnt++;
//prt();
//return;
}
else
dfs(k+1);
mp[r[k][1]][r[k][2]]=0;
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>mp[i][j];
if(mp[i][j]=='*'){
r[++num][1]=i;
r[num][2]=j;
}
}
}
dfs(1);
cout<<cnt;
return 0;
}
/**************************************************************
Problem: 1691
User: admin
Language: C++
Result: Accepted
Time:22 ms
Memory:2080 kb
****************************************************************/