zoj1654

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

程序效率太差了

到现在还是只会用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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值