【发布时间】:2018-08-16 09:56:41
【问题描述】:
这是我的代码:
#include <iostream>
#include <stdlib.h>
using namespace std;
int find_cross(char*, int, int, int);
void reduction(char*, char*, int, int);
int main(){
int n;
int m;
cin >> n >> m;
char *data = new char[n * m];
for(int i = 0; i < n; i++){
cin >> (data+i*m);
}
cout << "pass one" << endl;
char *original = new char[n * m];
cout << "pass two" << endl;
for(int i = 0; i < n * m; i++){
*(original+i) = *(data+i);
}
int biggest_size;
if(n >= m){
if(m % 2 == 0){
biggest_size = m - 1;
}else{
biggest_size = m;
}
}else{
if(n % 2 == 0){
biggest_size = n - 1;
}else{
biggest_size = n;
}
}
{
int biggest = 0;
for(int i = 1; i < biggest_size + 1; i = i + 2){
reduction(data, original, n, m);
if(find_cross(data, i, n, m)){
for(int j = biggest_size; j >= 1; j = j - 2){
if(find_cross(data, j, n, m)){
if((i * 2 - 1) * (j * 2 - 1) > biggest){
biggest = (i * 2 - 1) * (j * 2 - 1);
}
break;
}
}
}
}
cout << biggest;
}
delete [] data;
delete [] original;
system("pause");
return 0;
}
int find_cross(char* data, int size, int row, int column){
for(int i = (size - 1) / 2; i < row - (size - 1) / 2; i++){
for(int j = (size - 1) / 2; j < column - (size - 1) / 2; j++){
int yes = 1;
for(int k = 0; k < (size - 1) / 2 + 1; k++){
if(*(data+(i+k)*column+j) != 'G' || *(data+(i-k)*column+j) != 'G' || *(data+i*column+j+k) != 'G' || *(data+i*column+j-k) != 'G'){
yes = 0;
break;
}
}
if(yes == 1){
for(int k = 0; k < (size - 1) / 2 + 1; k++){
*(data+(i-k)*column+j) = 'A';
*(data+(i+k)*column+j) = 'A';
*(data+i*column+j+k) = 'A';
*(data+i*column+j-k) = 'A';
}
return 1;
}else if(i == row - (size - 1) / 2 - 1 && j == column - (size - 1) / 2 - 1){
return 0;
}
}
}
return -1;
}
void reduction(char* data, char* original, int row, int column){
for(int i = 0; i < row; i++){
for(int j = 0; j < column; j++){
*(data+i*column+j) = *(original+i*column+j);
}
}
}
这是我的输入:
14 12
GGGGGGGGGGGG
GGGGGGGGGGGG
BGBGGGBGBGBG
BGBGGGBGBGBG
GGGGGGGGGGGG
GGGGGGGGGGGG
GGGGGGGGGGGG
GGGGGGGGGGGG
BGBGGGBGBGBG
BGBGGGBGBGBG
BGBGGGBGBGBG
BGBGGGBGBGBG
GGGGGGGGGGGG
GGGGGGGGGGGG
执行结果:
14 12
GGGGGGGGGGGG
GGGGGGGGGGGG
BGBGGGBGBGBG
BGBGGGBGBGBG
GGGGGGGGGGGG
GGGGGGGGGGGG
GGGGGGGGGGGG
GGGGGGGGGGGG
BGBGGGBGBGBG
BGBGGGBGBGBG
BGBGGGBGBGBG
BGBGGGBGBGBG
GGGGGGGGGGGG
GGGGGGGGGGGG
pass one
--------------------------------
Process exited after 256.8 seconds with return value 3221226356
问题出现在char *original = new char[n * m];,无法成功执行,程序crash。但是有一个奇怪的事情发生了,数组char *data = new char[n * m];可以分配成功。发生了什么,以及如何解决这个问题?
Original picture
【问题讨论】:
-
我没有仔细检查你的代码,但很可能你访问的范围超出了数组的范围。尝试使用
vector代替new char,并使用at(x)代替[x]。并捕获异常 -
我不知道为什么它是粉碎。并且 return 不是 0。
-
发生了什么“问题...”?如果你不解释清楚,我们怎么知道“发生了什么”?
-
您正在写超过
data的结尾,这是未定义的。 -
指针算法太复杂了,任何人都无法说“这确实是正确的”。编写一个指数计算函数并使用它。
标签: c++ arrays dynamic-memory-allocation