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;}
阅读全文
0 0
- zoj1654
- ZOJ1654
- zoj1654
- ZOJ1654:Place the Robots
- ZOJ1654(二分构图题典例)
- 匈牙利算法 zoj1654
- zoj1654 Place the Robots
- ZOJ1654 Place the Robots
- ZOJ1654 Place the Robots
- [ZOJ1654]放置机器人
- ZOJ1654 Place the Robots
- zoj1654——Place the Robots
- 【二分匹配】zoj1654 Place the Robots
- ZOJ1654 place the robots(二分图匹配)
- ZOJ1654 Place the Robots (二分图匹配)
- ZOJ1654 ZOJ那个___不让我过!
- [ZOJ1654]Place the Robots 做题笔记
- ZOJ1654 离散化+二分图匹配 匈牙利算法
- 百度地图SDK定位工具类
- java中的继承
- Putty的使用问题
- logback logback.xml常用配置详解(三)<filter>
- 用_Python_和_Asyncio_编写在线多人游戏(三)
- zoj1654
- Storm 时间滑动窗口+topN+Hbase
- Jquery 获取对象的几种方式介绍
- 每日积累(20170609-day-24)(Qt designer 界面 最小化及最大化按钮)
- 自定义Android扇形的加载ProgressBar
- php array_column() 返回输入数组中某个单一列的值。
- 无法启动MYSQL服务”1067 进程意外终止”解决办法
- Zxing二维码扫描生成
- linux 内核对vlan 的接收