| ||||||||||
| 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 | |||||||||
Re:求教runtime error 本地运行正常(已经解决,附上全部代码C++)In Reply To:求教runtime error 本地运行正常 Posted by:freelark at 2016-11-01 18:57:42 #include <iostream>
#include <stdlib.h>
#include <vector>
#include <string>
#include <iomanip>
using namespace std;
void math();
void mathBig(); //处理n过宽的数据--直接写入
void analysis(int *grid, int *gridDec, int lW, int lN, int line = 1,int downEdge = 2);//lW行宽,lN计算宽,downEdge下边界
int writeLine(int* grid, int* gridDec, int pixel, int n, int m, int sum);//向表中写入数据
void printVec(); //打印并清空
void printV(int*v, int row, int col);
int width = 0;
vector<vector<int>>resVec;
vector<int>tempV;
int main(void)
{
while (cin >> width){
if (width == 0) break;
else if (width < 100000 ) math();
else mathBig() ;
}
cout << "0";
system("pause");
return 0;
}
void analysis(int *grid, int *gridDec, int lW, int lN, int line, int downEdge){
int x = 0;
int *res = new int[8];
memset(res, 0, 8 * sizeof(int));
//cout << "------计算用表--------" << endl;
//printV(grid, 3, width);
for (int i = 0; i<lN; i++){
memset(res, 0, 8 * sizeof(int));
x = line*lW + i;
if (line > 0){
if (i>0)
res[0] = abs(grid[x - lW - 1] - grid[x]);
res[1] = abs(grid[x - lW] - grid[x]);
if (i<lW - 1)
res[2] = abs(grid[x - lW + 1] - grid[x]);
}
if (i > 0)
res[3] = abs(grid[x - 1] - grid[x]);
if (i < lW - 1)
res[4] = abs(grid[x + 1] - grid[x]);
if (line < downEdge){
if (i > 0)
res[5] = abs(grid[x + lW - 1] - grid[x]);
res[6] = abs(grid[x + lW] - grid[x]);
if (i < lW - 1)
res[7] = abs(grid[x + lW + 1] - grid[x]);
}
for (int j = 1; j<8; j++){
if (res[0]<res[j])
res[0] = res[j];
//cout << setw(4) << res[j];
}
//cout << endl;
gridDec[i] = res[0];
}
//分析并读入vector,这里是全行写入,不足也要把0写进去
for (int i = 0; i<lN; i++){
if (resVec.size()>0 && gridDec[i] == resVec.back()[0]){
resVec.back()[1]++;
}
else{
tempV.clear();
tempV.push_back(gridDec[i]);
tempV.push_back(1);
resVec.push_back(tempV);
}
}
//cout << "------结果-------" << endl;
//printV(gridDec, 1, width);
delete[]res;
}
int writeLine(int* grid, int* gridDec, int pixel, int n, int m,int sum)//n:写入总量,m:表中现有数量,sum:总数据量
{
//cout << "n=" << n << endl;
for (int i = 0; i < n; i++)
{
if (m < 3 * width){
grid[m] = pixel;
if (m == 3 * width - 1){
// cout << "已写入数据总量sum-n+i=" << sum - n + i << endl;
if (sum-n+i == 3 * width-1) analysis(grid, gridDec, width, width, 0); //计算首行
analysis(grid, gridDec, width, width); //满行时发生计算
}
m++;
}
else
{
for (int k = 0; k < width; k++){
grid[k] = grid[k + width];
grid[k + width] = grid[k + 2 * width];
grid[k + 2 * width] = 0;
}
grid[m - width] = pixel;
m = m - width;
m++;
}
}
return m;
}
void math(){
int pixel, n; //像素,数量
int gridNumbers = 0; //表1数据总量
int sum = 0;//记录要计算的数据总数
int* grid = new int[width * 3]; //分析三排
memset(grid, 0, 3 * width*sizeof(int));
int* gridDec = new int[width]; //目标列表
memset(gridDec, 0, width*sizeof(int));
while (cin >> pixel >> n){
if (pixel == 0 && n == 0) {
if (sum < 3 * width) {
if (sum <= width) analysis(grid, gridDec, width, sum, 0, 0);
else analysis(grid, gridDec, width, width, 0, 1);
if (sum <=2 * width&& sum > width) analysis(grid, gridDec, width, sum - width, 1, 1);
else if (sum >2 * width) analysis(grid, gridDec, width, width, 1, 1);
if (sum > 2 * width) analysis(grid, gridDec, width, sum-2*width,2);
break;
}
analysis(grid, gridDec, width, width, 2);
break;
}
if (n >= 3 * width){
sum += 2 * width;
gridNumbers = writeLine(grid, gridDec, pixel, 2 * width, gridNumbers, sum); //grid数满时计算第2行,sum小于3倍width时计算第1行
tempV.clear();
tempV.push_back(0);
tempV.push_back(n - 3 * width);
resVec.push_back(tempV);
n = width; //满员,触发计算
}
sum += n; //总计算数据量
gridNumbers = writeLine(grid, gridDec, pixel, n, gridNumbers, sum);
}
//输出结果
printVec();
delete[] grid;
delete[] gridDec;
sum = 0;
}
void mathBig(){
int pixel, n;
while (cin >> pixel >> n){
if (pixel == 0 && n == 0) break;
tempV.clear();
tempV.push_back(0);
tempV.push_back(n);
resVec.push_back(tempV);
}
printVec();
}
void printVec(){
cout << width << endl;
for (unsigned int i = 0; i < resVec.size(); i++)
cout << resVec[i][0] << " " << resVec[i][1] << endl;
resVec.clear();
cout << "0 0" << endl;
}
void printV(int*v, int row, int col){
for (int i = 0; i < row; i++){
for (int j = 0; j < col; j++)
cout << setw(5) << v[j + col*i];
cout << endl;
}
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator