您的位置:首页 > 其它

ural 1627

2013-04-30 19:38 155 查看
与论文题没什么区别

#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <map>
#include <stack>
#include <set>
#include <sstream>
#include <fstream>
#include <cmath>
#include <functional>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <numeric>
#include <bitset>
#include <iomanip>
using namespace std;
typedef long long ll;
#define lson l , m ,rt<<1
#define rson m+1,r,rt<<1|1
typedef vector<string> VS;
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef vector<VVI> VVVI;
typedef pair<int, int> pii;
const int mod = 1000000000;
const int N = 511;
const int M = 1111111;
ll det

;
int num

;
char s

;
int dx[] = { 0, 1, 0, -1 };
int dy[] = { 1, 0, -1, 0 };
int n, m;
int cnt;
ll Det(int n) {
ll ans = 1;
int i, j, k;
for (i = 0; i < n; ++i) {
for (j = i + 1; j < n; ++j) {
while (det[j][i]) {
ll t = det[i][i] / det[j][i];
for (k = i; k < n; ++k) {
det[i][k] -= det[j][k] * t;
det[i][k] %= mod;
}
for (k = 0; k < n; ++k)
swap(det[i][k], det[j][k]);
ans *= -1;
}
}
if (!det[i][i])
return 0;
}
for (i = 0; i < n; ++i)
ans = ans * det[i][i] % mod;
return (ans % mod + mod) % mod;
}
int main() {
int x, y;
int u, i, k, j;
scanf("%d%d", &n, &m);
for (i = 0; i < n; ++i)
scanf("%s", s[i]);
for (i = 0; i < n; ++i)
for (j = 0; j < m; ++j)
if (s[i][j] == '.')
num[i][j] = cnt++;
for (i = 0; i < n; ++i) {
for (j = 0; j < m; ++j) {
if (s[i][j] == '*')
continue;
u = num[i][j];
int c = 0;
for (k = 0; k < 4; ++k) {
x = i + dx[k];
y = j + dy[k];
if (x < 0 || x >= n || y < 0 || y >= m)
continue;
if (s[x][y] == '.')
det[u][num[x][y]] = -1, c++;
}
det[u][u] = c;
}
}
printf("%I64d\n", Det(cnt - 1));
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: