继上一篇组合数学DP以后我又要来侮辱数学了……希望各位大佬不要拍砖。
1 /*
2 * =====================================================================================
3 *
4 * Filename: guass.cpp
5 *
6 * Description: guass xor equations
7 *
8 * Version: 1.0
9 * Created: 2011年03月27日 11时32分41秒
10 * Revision: none
11 * Compiler: gcc
12 *
13 * Author: ronaflx
14 * Company: hit-acm-group
15 *
16 * =====================================================================================
17 */
18
19 #include < iostream >
20 #include < cstdio >
21 #include < cstring >
22 #include < string >
23 #include < cmath >
24 #include < algorithm >
25 using namespace std;
26 const int N = 650 ;
27 int A[N][N], b[N];
28 /*
29 * === FUNCTION ======================================================================
30 * Name: label
31 * Description:
32 * =====================================================================================
33 */
34 int
35 label ( int i, int j, int m)
36 {
37 return i * m + j;
38 } /* ----- end of function label ----- */
39 /*
40 * === FUNCTION ======================================================================
41 * Name: abs
42 * Description:
43 * =====================================================================================
44 */
45 int
46 abs ( int x )
47 {
48 return x < 0 ? - x : x;
49 } /* ----- end of function abs ----- */
50
51 /*
52 * === FUNCTION ======================================================================
53 * Name: judge
54 * Description:
55 * =====================================================================================
56 */
57 bool judge( int x, int y, int n, int m)
58 {
59 if (x >= 0 && x < n && y >= 0 && y < m)
60 return true ;
61 return false ;
62 } /* ----- end of function judge ----- */
63 /*
64 * === FUNCTION ======================================================================
65 * Name: gauss
66 * Description: gauss solve xor equations
67 * =====================================================================================
68 */
69 int
70 guass ( int n)
71 {
72 int i, j;
73 for (i = 0 , j = 0 ;i < n && j < n;i ++ , j ++ )
74 {
75 if ( ! A[i][j])
76 {
77 for ( int k = i + 1 ;k < n;k ++ )
78 {
79 if (A[k][j])
80 {
81 for ( int s = j;s < n;s ++ )
82 swap(A[i][s], A[k][s]);
83 swap(b[k], b[i]);
84 break ;
85 }
86 }
87 if ( ! A[i][j]) // 如果这个列都为零那么用这一行的下一列消元
88 {
89 i -- ;
90 continue ;
91 }
92 }
93 for ( int k = i + 1 ;k < n;k ++ )
94 {
95 if (A[k][j] == 0 ) continue ;
96 for ( int s = j;s < n;s ++ )
97 A[k][s] ^= A[i][s];
98 b[k] ^= b[i];
99 }
100 }
101 if (i < n)
102 {
103 for ( int k = i;k < n;k ++ )
104 if (b[k])
105 return 0 ;
106 }
107 return 1 ;
108 } /* ----- end of function gauss ----- */
109
110 /*
111 * === FUNCTION ======================================================================
112 * Name: main
113 * Description:
114 * =====================================================================================
115 */
116 int
117 main ()
118 {
119 int n, m, d;
120 while (scanf( " %d %d %d " , & m, & n, & d) == 3 && n)
121 {
122 for ( int i = 0 ;i < n;i ++ )
123 for ( int j = 0 ;j < m;j ++ )
124 {
125 int t;
126 scanf( " %d " , & t);
127 b[label(i, j, m)] = t ? 1 : 0 ;
128 }
129 memset(A, 0 , sizeof (A));
130 for ( int i = 0 ;i < n;i ++ )
131 for ( int j = 0 ;j < m;j ++ )
132 for ( int x = 0 ;x < n;x ++ )
133 for ( int y = 0 ;y < m;y ++ )
134 if ((i == x && j == y) || abs(i - x) + abs(j - y) == d)
135 A[label(i, j, m)][label(x, y, m)] = 1 ;
136 printf( " %d\n " , guass(n * m));
137 }
138 return 0 ;
139 } /* ---------- end of function main ---------- */
上上周周赛的内容,比赛当时我就说是高斯消元,可以觉的复杂度太大了,刷牛果断高斯消元过了……
小猴也不会写高斯消元解异或方程组,于是艰巨的任务有一次落在了我的头上,在cai的讲解下明白了,解法,于是果断测试
因为 n和m写反了,以及m写成n了种种问题WA了一天。浪费时间了
高斯消元的题目我就找了两个简单的做做了
除了 UVA 5070还有就是POJ 1830了,其他的题以后有待学习。最近忙于数据结构和DP在软件设计作业的干扰下浪费了太多时间了,GUI什么的都是浮云