错误代码:
#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;
}