| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
WA?对所有的sample都通过了;对单行的也试过了。难道是输入输出格式有问题?
#include <iostream>
#include <fstream>
#include <list>
#include <utility>
#include <cmath>
using namespace std;
int EDGE_POS[8][2] = {{-1, -1}, {0, -1}, {1, -1},
{-1, 0}, {1, 0},
{-1, 1}, {0, 1}, {1, 1}};
struct Picture
{
int width;
int height;
int nPixes;
list<pair<int, int> > pixes;
list<pair<int, int> > edges;
};
typedef list<pair<int, int> >::iterator Itr;
bool getData(istream& in, Picture & pic)
{
char wait= 111;
pic.nPixes = 0;
pic.width = 0;
pic.height = 0;
pic.edges.clear();
pic.pixes.clear();
int pix, pixNum;
in >> pic.width;
if (!pic.width)
return false;
for (;;)
{
in >> pix >> pixNum;
if (pix == 0 && pixNum ==0)
break;
pic.pixes.push_back(pair<int, int> (pix, pixNum));
pic.nPixes += pixNum;
}
pic.height = pic.nPixes / pic.width;
return true;
}
int invalidatePos(int pos, int xoffset, int yoffset, int width, int height)
{
int x = pos % width;
int y = pos / width;
x += xoffset;
y += yoffset;
if ( 0 <= x && x < width && 0 <= y && y < height)
return y * width + x;
else
return -1;
}
void edgeDetect(Picture & pic)
{
int blockCounter = 0;
Itr itAround;
Itr it = pic.pixes.begin();
bool inManyRows = false;
int numRows = it->second / pic.width;
if (numRows > 3)
inManyRows = true;
if (pic.pixes.size() == 1)
{
pic.edges.push_back(pair<int, int> (0, pic.width));
return;
}
for(int i = 0; i < pic.nPixes; ++i)
{
int maxEdge = 0;
if ( inManyRows && blockCounter == pic.width + 1)
{
int num2Skip = (it->second - (2 * pic.width + 2) - 1);
i += num2Skip;
blockCounter += num2Skip;
inManyRows = false;
if (pic.edges.empty())
pic.edges.push_back(pair<int, int> (0, num2Skip+1));
else
if (pic.edges.back().first == 0)
pic.edges.back().second += num2Skip+1;
else
pic.edges.push_back(pair<int, int> (0, num2Skip+1));
}
else
{
for (int j = 0; j < 8 ; ++j)
{
int pos = invalidatePos(i, EDGE_POS[j][0], EDGE_POS[j][1], pic.width, pic.height);
if ( pos > 0)
{
int diff = pos - i;
int relativePos = diff + blockCounter;
itAround = it;
int ob = itAround->second;
if (relativePos >=0 && relativePos < itAround->second)
;
else if (relativePos < 0)
while(relativePos < 0)
{
--itAround;
relativePos += itAround->second;
}
else if (relativePos >= it->second)
while(relativePos >= itAround->second)
{
relativePos -= itAround->second;
++itAround;
}
int newEdge = abs(itAround->first - it->first);
if (maxEdge < newEdge)
maxEdge = newEdge;
}
}
if (pic.edges.empty())
pic.edges.push_back(pair<int, int> (maxEdge, 1));
else
if (pic.edges.back().first == maxEdge)
pic.edges.back().second ++;
else
pic.edges.push_back(pair<int, int> (maxEdge, 1));
}
blockCounter++;
if (blockCounter == it->second)
{
blockCounter = 0;
++it;
int numRows = it->second / pic.width;
if (numRows > 3)
inManyRows = true;
}
}
}
int main(int argc, char* argv[])
{
// ifstream input("data4.txt", ios::in);
Picture picture;
// while (getData(input, picture))
while (getData(cin, picture))
{
edgeDetect(picture);
Itr it;
cout << picture.width << "\n";
for (it = picture.edges.begin(); it != picture.edges.end(); ++it)
cout << it->first << " " << it->second << "\n";
cout << "0 0" <<endl;
}
cout << "0" << endl;
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator