#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
using namespace std;
#define   sz(s)         s.size()
#define   ll            long long int
#define   ull           unsigned ll
#define   ld            long double
#define   print(v)      for(ll i=0;i<v.size();i++)cout<<v[i]<<" "
#define   printpair(v)  for(ll i=0;i<v.size();i++)cout<<v[i].first<<" "<<v[i].second<<"\n"
#define   bmd           1000000007
#define   bmd1          998244353
#define   umll          unordered_map<ll,ll>
#define   mll           map<ll,ll>
#define   mcl           map<char,ll>
#define   pll           pair<ll,ll>
#define   F             first
#define   S             second
#define   setp(x)       setprecision(x)
#define   pb            push_back
#define   all(v)        v.begin(),v.end()
#define   tr(a)         for(auto it=a.begin();it!=a.end();it++)
#define   trr(a)        for(auto it1=a.begin();it1!=a.end();it1++)
#define   vll           vector<long long int>
#define   sorty(v)      sort(v.begin(),v.end())
#define   rsort(v)      sort(v.rbegin(),v.rend())
#define   unik(v)       v.erase(unique(all(v)),v.end())
#define   PI            3.1415926535897932384626
#define   db()          cout<<"\n"<<"here"<<"\n"
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;


//---------------------------------------------------------------------------
const int MOD = bmd;
const int N=2e5+100;
inline  ll sqr(ll x){return x*x;}
inline  void normal(ll &a) { a = (a+MOD)%MOD; }
inline  ll modMul(ll a, ll b) { a %= MOD, b %= MOD; normal(a), normal(b); return (a*b)%MOD; }
inline  ll modAdd(ll a, ll b) { a %= MOD, b %= MOD; normal(a), normal(b); return (a+b)%MOD; }
inline  ll modSub(ll a, ll b) { a %= MOD, b %= MOD; normal(a), normal(b); a -= b; normal(a); return a; }
inline  ll modPow(ll b, ll p) { ll r = 1;b=b%MOD; while(p) { if(p&1) r = modMul(r, b); b = modMul(b, b); p >>= 1; } return r; }
inline  ll modInv(ll a) { return modPow(a, MOD-2); }
inline  ll modDiv(ll a,ll b) { return modMul(a, modInv(b)); }
//---------------------------------------------------------------------------
char a[10][10];
ll h,w,k,tot;
bool chk(vll row,vll col)
{
    ll cnt=0;
    map<pll,ll> vis;
    for(ll k=0;k<sz(row);k++){
        ll r=row[k];
        if(r==0)continue;
        for(ll j=1;j<=w;j++){
            if(a[r][j] == '#' && !vis[{r,j}])
                cnt++;
            vis[{r,j}]=1;
        }
    }
    for(ll k =0 ;k<sz(col);k++){
        ll c=col[k];
        if(c==0)continue;
        for(ll i=1;i<=h;i++){
            if(a[i][c] == '#' && !vis[{i,c}])
                cnt++;
            vis[{i,c}]=1;
        }
    }
    if((tot-cnt) == k)return true;
    else return false;
}
void solve()
{
    ll ans=0;
    cin>>h>>w>>k;
    for(ll i=1;i<=h;i++){
        for(ll j=1;j<=w;j++){
            cin>>a[i][j];
            if(a[i][j] == '#')
                tot++;
        }
    }
    for(ll i=1;i<=(1<<h);i++){
        vll row;
        for(ll k=0;k<30;k++){
            if(i&(1<<k))
                row.pb(k+1);
        }
        for(ll j=1;j<=(1<<w);j++){
            vll col;
            for(ll k=0;k<30;k++){
                if(j&(1<<k))
                    col.pb(k+1);
            }
            if(row.empty() || col.empty())continue;

            if(chk(row,col))ans++;
        }
    }
    //ans/=2;
    /*for(ll j=1;j<=w;j++){
        vll col;
        vll row;
        for(ll k=1;k<30;k++){
            if(k&(1<<j))
                col.pb(k);
        }
        if(chk(row,col))ans++;
    }
    for(ll i=1;i<=h;i++){
        vll col;
        vll row;
        for(ll k=1;k<30;k++){
            if(k&(1<<i))
                row.pb(k);
        }
        if(chk(row,col))ans++;
    }*/
    cout <<ans<<"\n";
}
int main()
{
    //ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);//first give all input then gives output
    ll t=1;
    //cin>>t;
    while(t--){
        solve();
    }

    return 0;
}


Measured memory_bytes: 3608