10022 - Delta-wave
Posted: Sun Nov 24, 2002 3:26 pm
Alright I keep getting WA for 10022, and I can't find the bug at all. I have tested on M,N from 1 to 25 extensively, and the program seems to be working perfectly. Can anyone test my program and tell me some test cases that can break my program? THANKS.
#include <iostream.h>
#include <stdlib.h>
void findlevel(unsigned, unsigned[]);
int main()
{
unsigned M, N, levelM, levelN, answer=0;
unsigned left, right, numInLevel, result[2];
unsigned leftMost, rightMost, level, temp1, temp2;
cin >> temp1 >> temp2;
M = (temp1 < temp2 ? temp1 : temp2);
N = (temp1 == M ? temp2 : temp1);
findlevel(M, result);
levelM = result[0];
numInLevel = result[1];
findlevel(N, result);
levelN = result[0];
answer+=(2 * (levelN - levelM));
level = levelM;
leftMost = M;
rightMost = M;
while(true)
{
if(level == levelN)
break;
leftMost+=numInLevel;
rightMost+=(2 + numInLevel);
level++;
numInLevel+=2;
}
//cout << "leftmost: " << leftMost << "\t" << "rightmost: " << rightMost;
//cout << "\n";
//cout << "answer at line 37: " << answer << "\n";
if(levelM == levelN)
answer = N - M;
else if(N >= leftMost && N <= rightMost)
{
answer = ((N - leftMost)%2 == 0 ? answer : answer+1);
}
else if(N > rightMost)
{
answer+=(N - rightMost);
}
else if(N < leftMost)
{
answer+=(leftMost - N);
}
// cout << "answer at line 53: " << answer << "\n";
if((levelM%2 == 0 && M%2 == 0) || (levelM%2 == 1 && M%2 == 1))
{
if(N>=leftMost && N<=rightMost &&
((levelN%2 == 0 && N%2==1) || (levelN%2 == 1 && N%2==0)))
answer-=2;
}
cout << answer << "\n";
return 0;
}
void findlevel(unsigned num, unsigned result[])
{
unsigned level=1, numInLevel=1, sofar=1;
while(true)
{
if(sofar >= num)
{
result[0] = level;
result[1] = numInLevel;
return;
}
level++;
numInLevel+=2;
sofar+=numInLevel;
}
}
#include <iostream.h>
#include <stdlib.h>
void findlevel(unsigned, unsigned[]);
int main()
{
unsigned M, N, levelM, levelN, answer=0;
unsigned left, right, numInLevel, result[2];
unsigned leftMost, rightMost, level, temp1, temp2;
cin >> temp1 >> temp2;
M = (temp1 < temp2 ? temp1 : temp2);
N = (temp1 == M ? temp2 : temp1);
findlevel(M, result);
levelM = result[0];
numInLevel = result[1];
findlevel(N, result);
levelN = result[0];
answer+=(2 * (levelN - levelM));
level = levelM;
leftMost = M;
rightMost = M;
while(true)
{
if(level == levelN)
break;
leftMost+=numInLevel;
rightMost+=(2 + numInLevel);
level++;
numInLevel+=2;
}
//cout << "leftmost: " << leftMost << "\t" << "rightmost: " << rightMost;
//cout << "\n";
//cout << "answer at line 37: " << answer << "\n";
if(levelM == levelN)
answer = N - M;
else if(N >= leftMost && N <= rightMost)
{
answer = ((N - leftMost)%2 == 0 ? answer : answer+1);
}
else if(N > rightMost)
{
answer+=(N - rightMost);
}
else if(N < leftMost)
{
answer+=(leftMost - N);
}
// cout << "answer at line 53: " << answer << "\n";
if((levelM%2 == 0 && M%2 == 0) || (levelM%2 == 1 && M%2 == 1))
{
if(N>=leftMost && N<=rightMost &&
((levelN%2 == 0 && N%2==1) || (levelN%2 == 1 && N%2==0)))
answer-=2;
}
cout << answer << "\n";
return 0;
}
void findlevel(unsigned num, unsigned result[])
{
unsigned level=1, numInLevel=1, sofar=1;
while(true)
{
if(sofar >= num)
{
result[0] = level;
result[1] = numInLevel;
return;
}
level++;
numInLevel+=2;
sofar+=numInLevel;
}
}