zoj1654

来源:互联网 发布:软件研究生大学排名 编辑:程序博客网 时间:2024/05/22 03:01

听老师讲完,还是写了好几天

程序效率太差了

到现在还是只会用for,if

说是Segmentation Fault

也可以想象

先贴上来

#include<iostream>#include<memory.h>using namespace std;int h[50][50], z[50][50],pre[50];char map[50][50];int nei[50][50],x,y;  //从1开始的bool v[50];void init();void input(int m, int n);int creatH(int m, int n);int creatZ(int m, int n);int judgeH(int i, int j, int n);int judgeZ(int i, int j, int m);void creatNEI(int m, int n);int dfs(int start);int main(){int t, i,j,k,num;cin >> t;for (i = 0; i < t; i++){init();for (j = 1; j <= x; j++){memset(v, 0, sizeof(v));dfs(j);}num = 0;for (k = 1; k <= y; k++){if (pre[k] != -1)  num++;}cout << "Case:" << i+1 << endl;cout << num  << endl;x = 0; y = 0;}return 0;}void init(){int m,n;memset(pre, -1, sizeof(pre));cin >> m >> n;input(m, n);x=creatH(m, n);y=creatZ(m, n);creatNEI(m, n);memset(map, 0, sizeof(map));memset(h, 0, sizeof(h));memset(z, 0, sizeof(z));}void input(int m, int n){int i, j;for (i = 0; i < m; i++){for (j = 0; j < n; j++){cin >> map[i][j];}}}int creatH(int m, int n){int i, j,c=1,t;for (i = 0; i < m; i++){for (j = 0; j < n; j++){if (map[i][j] == 'o'){while (map[i][j] != '#'&&j<n){h[i][j] = c;j++;}c++;}else if (map[i][j] == '*'){t = judgeH(i, j, n);if (t == 1){while (map[i][j] != 'o'&&j < n){h[i][j] = c;j++;}h[i][j] = c;c++;}else if (t == -1)while (map[i][j] != '#'&&j < n){j++;}elsej = n;}}}return c-1;}int judgeH(int i, int j,int n){for (j; j < n; j++){if (map[i][j] == 'o')return 1;        //先遇到空地else if (map[i][j] == '#')return -1;       //先遇到石头}return 0;                //先遇到草}int judgeZ(int i, int j, int m){for (i; i < m; i++){if (map[i][j] == 'o')return 1;        //先遇到空地else if (map[i][j] == '#')return -1;       //先遇到石头}return 0;                //先遇到草}int creatZ(int m, int n){int i, j, c = x+1, t;for (j = 0; j < n; j++){for (i = 0; i < m; i++){if (map[i][j] == 'o'){while (map[i][j] != '#'&&i<m){z[i][j] = c;i++;}c++;}else if (map[i][j] == '*'){t = judgeZ(i, j, n);if (t == 1){while (map[i][j] != 'o'&&i < m){z[i][j] = c;i++;}z[i][j] = c;c++;}else if (t == -1)while (map[i][j] != '#'&&i < m){i++;}elsei = m;}}}return c-1;}void creatNEI(int m,int n){int i, j;int a, b;for (i = 0; i < m; i++){for (j = 0; j < n; j++){a = h[i][j];b = z[i][j];if (a && b){nei[a][b] = 1;nei[b][a] = 1;}}}}int dfs(int start){int i, temp;for (i = 1; i <= y; i++){if (nei[start][i] == 1 && v[i] == 0){v[i] = 1;temp = pre[i];pre[i] = start;if (temp == -1 || dfs(temp))return 1;pre[i] = temp;}}return 0;}


终于变成了WA

虽然如此

还是觉得有所收获

编号均从1和编号一直叠加

所形成的矩阵自然是截然不同的

开始递归的地方自然也是不同的

计数是否要除以二也是要好好考虑的

现在是真心觉得完全理解了老师所讲的

但是还是错的。。

先这样放着吧

#include<iostream>#include<memory.h>using namespace std;int h[51][51], z[51][51], pre[51];char map[51][51];int x, y;  //从1开始的bool v[51*51],nei[51*51][51*51];void init();void input(int m, int n);int creatH(int m, int n);int creatZ(int m, int n);void creatNEI(int m, int n);int dfs(int start);int main(){int t, i, j, k, num;cin >> t;for (i = 0; i < t; i++){init();for (j = 1; j <= y; j++){memset(v, 0, sizeof(v));dfs(j);}num = 0;for (k = 1; k <= y; k++){if (pre[k] != -1)  num++;}cout << "Case:" << i + 1 << endl;cout << num/2 << endl;x = 0; y = 0;}return 0;}void init(){int m, n;memset(pre, -1, sizeof(pre));memset(map, 0, sizeof(map));memset(h, 0, sizeof(h));memset(z, 0, sizeof(z));memset(nei, 0, sizeof(nei));cin >> m >> n;input(m, n);x = creatH(m, n);y = creatZ(m, n);creatNEI(m, n);}void input(int m, int n){int i, j;for (i = 0; i < m; i++){for (j = 0; j < n; j++){cin >> map[i][j];}}}int creatH(int m, int n){int i, j, c = 0;bool f = 0;for (i = 0; i < m; i++)   //从1开始编号{f = 0;//f = 1;for (j = 0; j < n; j++){if (map[i][j] == 'o'){if (!f)//f{c++;//f = 0;}h[i][j] = c;f = 1;}else if (map[i][j] == '#')f = 0;//f = 1;}}return c;}int creatZ(int m, int n){int i, j, c = x;bool f = 0;for (j = 0; j < n; j++){f = 0;//f = 1;for (i = 0; i < n; i++){if (map[i][j] == 'o'){if (!f)//f{c++;//f = 0;}z[i][j] = c;f = 1;}else if (map[i][j] == '#')f = 0;//f = 1;}}return c;}void creatNEI(int m, int n){int i, j;int a, b;for (i = 0; i < m; i++){for (j = 0; j < n; j++){a = h[i][j];b = z[i][j];if (a&&b){nei[a][b] = 1;nei[b][a] = 1;}}}}int dfs(int start){int i, temp;for (i = 1; i <= y; i++){if (nei[start][i] == 1 && v[i] == 0){v[i] = 1;temp = pre[i];pre[i] = start;if (temp == -1 || dfs(temp))return 1;pre[i] = temp;}}return 0;}


原创粉丝点击