听老师讲完,还是写了好几天
程序效率太差了
到现在还是只会用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++;
}
else
j = 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++;
}
else
i = 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;
}