洛谷p1056排座椅

错误代码:

#include<iostream>
#include<cstring>
using namespace std;
char s[15][15];//存储读进来的字符串
int  a[15][15];//起始格标号,不是起始格的标号为0,黑格标号为-1
int visit[15][15];
int main()
{
	int kase = 0;
	int r, c;
	while (cin >> r && r != 0)
	{
		cin >> c;

		memset(a, 0, sizeof(a));
		int k = 1;
		for (int i = 1; i <= r; i++)
		{
		
			for (int j = 1; j <= c; j++)
			{
			
				cin >> s[i][j];
				if (s[i][j] != '*')
				{
					a[i][j] = -1;//黑格初始化
					if (i == 1 || j == 1)
					{
						a[i][j] = k++;
						continue;
					}
					if (s[i - 1][j] == '*' || s[i][j - 1] == '*')
						a[i][j] = k++;
				}
				//if (i == 1 || j == 1 || s[i - 1][j] == '*' || s[i][j - 1] == '*')
					//a[i][j] = k++;//起始格初始化
			}
		}
		memset(visit, 0, sizeof(visit));
		if (kase > 0)
			cout << endl;//每一组测试结果之间有一行空格
		printf("Puzzle #%d:\n", ++kase);
		cout << "Across" << endl;
		for (int i = 1; i <= r; i++)
		{
			for (int j = 1; j <= c; j++)
			{
				if (a[i][j] > 0 && visit[i][j] == 0)
				{
					int k = j;
					printf("%3d.", a[i][j]);
					while (a[i][k] !=0)
					{
						cout << s[i][k];
						visit[i][k] = i;
						k++;
					}
					cout << endl;
				}
			}
		}
		memset(visit, 0, sizeof(visit));
		cout << "Down" << endl;
		for (int i = 1; i <= r; i++)
		{
			for (int j = 1; j <= c; j++)
			{
				if (a[i][j] > 0 && visit[i][j] == 0)
				{
					int k = i;
					printf("%3d.", a[i][j]);
					while (a[k][j] != 0)
					{
						cout << s[k][j];
						visit[k][j] = i;
						k++;
					}
					cout << endl;
				}
			}
		}
	}
	return 0;
}

在标记能够交头接耳的人的时候出错:四个方格内的人
|a| b|
|c|d|
a=b=1;
c=d=2;
这时候,要是再来个b和d交头接耳,那么c就尴尬了。
下面的是正确代码:

#include<iostream>
#include<cstring>
#include<ctime>
using namespace std;
#define min(a,b) a<b?a:b
int row[1005];
int line[1005];
int partition(int a[], int l, int r)
{
 int i = l+1;
 int j = r;
 int temp = a[l];
 while (1)
 {
  while (a[i] > temp && i < r)
   i++;
  while (a[j] < temp && j > l)
   j--;
  if (i >= j)
   break;
  int t = a[i];
  a[i] = a[j];
  a[j] = t;
  i++;
  j--;
 }
 a[l] = a[j];
 a[j] = temp;
 return j;
}
int RandomPart(int a[], int l, int r)
{
 /*srand((int)time(0));
 int i = rand() % (r - l + 1) + l;
 int t = a[i];
 a[i] = a[l];
 a[l] = t;*/
 int i = partition(a, l, r);
 return i;
}
int RandomSelect(int a[], int l, int r, int k)
{
 if (l == r)
  return a[l];
 //int i = RandomPart(a, l, r);
 int i = partition(a, l, r);
 int j = i - l + 1;
 if (k < j)
  return RandomSelect(a, l, i - 1, k);
 else if (k == j)
  return a[i];
 else
  return RandomSelect(a, i + 1, r, k - j);
}
int main()
{
 int M, N, K, L, D;
 cin >> M >> N >> K >> L >> D;
 memset(row, 0, sizeof(row));
 memset(line, 0, sizeof(line));
 for (int i = 0; i < D; i++)
 {
  int x, y, p, q;
  cin >> x >> y >> p >> q;
  if (x == p)
   line[min(y, q)]++;
  else
   row[min(x, p)]++;
 }
 int tep[1005];
 memset(tep, 0, sizeof(tep));
 for (int i = 1; i <= M; i++)
  tep[i] = row[i];
 int kmin = RandomSelect(tep, 1, M, K);
 for (int i = 1; i <= M; i++)
  if (row[i] >= kmin)
   cout << i << " ";
 memset(tep, 0, sizeof(tep));
 for (int i = 1; i <= N; i++)
  tep[i] = line[i];
 int lmin = RandomSelect(tep, 1, N, L);
 
 cout << endl;
 for (int i = 1; i <= N; i++)
  if (line[i] >= lmin)
   cout << i << " ";
 return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值