사천성 문제인데요...
RTE (SIGSEGV: segmentation fault, probably incorrect memory access or stack overflow)\
오류가 발상합니다. 비주얼스투디오로 컴파일 할때는
오류없이 답이 잘 출력이 되는데요...
어느부분이 문제인지 모르겠습니다.
알고리즘이 길어서 조금 설명을 해 드리면
문자가 있는 좌표값을 각각 받아서
같은 문자가 있는 곳 까지 3번안에 가는 방법을 검색합니다
'.'이아니거나 사천성 크기의 제일 끝으로 가게되면
그 부딪힌 부분이 자신과 맞는 문자쌍인지 확인을 하고
아니면 모든 경우의 수를 또 확인해 나갑니다.
+한가지 질문을 더 드리자면
너무 알고르짐이 길어지고, 단순하게 모든 경우의 수를
확인하는 알고리즘이 되었는데 뭔가 찝찝하네요
저의 접근방향이 잘못된 것인가요?
#include <iostream>#include<string>#include <string.h>usingnamespacestd;stringMatrix[55];intRow,Col,z,TotalAnswer=0;classAnswer{public:charchr;intcoll;introw;};boolAnswerCheck(AnswerStart,AnswerTarget);intmain(){intCount;cin>>Count;while(Count--){Row=0;Col=0;z=0;TotalAnswer=0;//string Char[26];AnswerRAnswer[2500];cin>>Col>>Row;for(inti=0;i<Col;i++){cin>>Matrix[i];}Col-=1;Row-=1;//공백이 아닌 문자를 가진걸 찾아 정의한 클래스안에 정보 저장for(inti=1;i<Col;i++){for(intj=1;j<Row;j++){if(Matrix[i][j]!='.'){RAnswer[z].chr=Matrix[i][j];RAnswer[z].coll=i;RAnswer[z].row=j;z++;}}}//같은 문자쌍 확인for(inti=0;i<z;i++){for(intj=i+1;j<z;j++){if(RAnswer[i].chr==RAnswer[j].chr){//함수 호출if(AnswerCheck(RAnswer[i],RAnswer[j])){TotalAnswer+=1;//cout << i << "=>" << j << endl;}}}}cout<<TotalAnswer<<endl;}}boolAnswerCheck(AnswerStart,AnswerTarget){intSourceColl=Start.coll;intSourceRow=Start.row;intTempColl=Start.coll;intTempRow=Start.row;//왼쪽 체크if((Start.row-1>=0&&Matrix[Start.coll][Start.row-1]=='.')||Start.row-1==Target.row&&Start.coll==Target.coll){if(Start.row-1==Target.row&&Start.coll==Target.coll){returntrue;}//왼쪽이 0이되거나 벽이 막힐떄 까지 계속감 for(inti=Start.row;i>0&&Matrix[Start.coll][Start.row-1]=='.';i--){Start.row--;}//부딪힌게 같은 문자인가 같은 문자면 트루값을 리턴if(Start.coll==Target.coll&&Start.row-1==Target.row){returntrue;}//한번꺾었다!!!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TempColl=Start.coll;TempRow=Start.row;//아니면 위나 아래로다시 진행 , 먼저 위for(inti=Start.coll;i>0&&Matrix[Start.coll-1][Start.row]=='.'&&i<Target.coll;i--){Start.coll--;}//부딪힌게 같은 A인가 확인, A이면if(Start.coll-1==Target.coll&&Start.row==Target.row){returntrue;}////두번쨰 꺾어사 오른쪽 왼쪽 진행!!!//위로 올라온후 무언가에 부딪히고, 좌나 우로 진행, 좌먼저for(inti=Start.row;i>0&&Matrix[Start.coll][Start.row-1]=='.'&&i>Target.row;i--){Start.row--;}if(Start.coll==Target.coll&&Start.row-1==Target.row){returntrue;}//그다음 우진행for(inti=Start.row;i<Row&&Matrix[Start.coll][Start.row+1]=='.'&&i<Target.row;i++){Start.row++;}if(Start.coll==Target.coll&&Start.row+1==Target.row){returntrue;}//처음꺽고 위쪽으로 가는 경우 다 조사했고 아래쪽으로 가는 경우 다 조사하자!!!Start.coll=TempColl;Start.row=TempRow;//다음 아래for(inti=Start.coll;i<Col&&Matrix[Start.coll+1][Start.row]=='.'&&i<Target.coll;i++){Start.coll++;}//부딪힌게 같은 A인가 확인, A이면if(Start.coll+1==Target.coll&&Start.row==Target.row){returntrue;}///아래 내려와서 좌 우 진행 먼저 왼쪽!!!for(inti=Start.row;i>0&&Matrix[Start.coll][Start.row-1]=='.'&&i>Target.row;i--){Start.row--;}if(Start.coll==Target.coll&&Start.row-1==Target.row){returntrue;}//그다음 우진행for(inti=Start.row;i<Row&&Matrix[Start.coll][Start.row+1]=='.'&&i<Target.row;i++){Start.row++;}if(Start.coll==Target.coll&&Start.row+1==Target.row){returntrue;}}Start.row=SourceRow;Start.coll=SourceColl;//오른쪽 체크if((Start.row+1<=Row&&Matrix[Start.coll][Start.row+1]=='.')||(Start.row+1==Target.row&&Start.coll==Target.coll)){if(Start.row+1==Target.row&&Start.coll==Target.coll)returntrue;//오른쪽으로 쭉가는 거 확인for(inti=Start.row;i<Row&&Matrix[Start.coll][Start.row+1]=='.';i++){Start.row++;}if(Start.coll==Target.coll&&Start.row+1==Target.row){returntrue;}//값 저장하고TempColl=Start.coll;TempRow=Start.row;//위쪽 간후for(inti=Start.coll;i>0&&Matrix[TempColl-1][Start.row]=='.'&&i>Target.coll;i--){Start.coll--;}//부딪힌게 같은 A인가 확인, A이면if(Start.coll-1==Target.coll&&Start.row==Target.row){returntrue;}//좌for(inti=Start.row;i>0&&Matrix[Start.coll][Start.row-1]=='.'&&i>Target.row;i--){Start.row--;}if(Start.coll==Target.coll&&Start.row-1==Target.row){returntrue;}//우for(inti=Start.row;i<Row&&Matrix[Start.coll][Start.row+1]=='.'&&i<Target.row;i++){Start.row++;}if(Start.coll==Target.coll&&Start.row+1==Target.row){returntrue;}//저장한 값 불러온 후Start.coll=TempColl;Start.row=TempRow;//아래로for(inti=Start.coll;i<Col&&Matrix[Start.coll+1][Start.row]=='.'&&i<Target.coll;i++){Start.coll++;}//부딪힌게 같은 A인가 확인, A이면if(Start.coll+1==Target.coll&&Start.row==Target.row){returntrue;}//좌for(inti=Start.row;i>0&&Matrix[Start.coll][Start.row-1]=='.'&&i>Target.row;i--){Start.row--;}if(Start.coll==Target.coll&&Start.row-1==Target.row){returntrue;}//우for(inti=Start.row;i<Row&&Matrix[Start.coll][Start.row+1]=='.'&&i<Target.row;i++){Start.row++;}if(Start.coll==Target.coll&&Start.row+1==Target.row){returntrue;}}//처음값 불러오기Start.row=SourceRow;Start.coll=SourceColl;//위쪽 체크if((Start.coll-1>=0&&Matrix[Start.coll-1][Start.row]=='.')||(Start.row==Target.row&&Start.coll-1==Target.coll)){if(Start.row==Target.row&&Start.coll-1==Target.coll)returntrue;//위쪽 끝까지 가고for(inti=Start.coll;i>0&&Matrix[Start.coll-1][Start.row]=='.';i--){Start.coll--;}if(Start.coll-1==Target.coll&&Start.row==Target.row){returntrue;}//중간값 저장TempColl=Start.coll;TempRow=Start.row;//오른쪽 for(inti=Start.row;i<Row&&Matrix[Start.coll][Start.row+1]=='.'&&i<Target.row;i++){Start.row++;}if(Start.coll==Target.coll&&Start.row+1==Target.row){returntrue;}//위for(inti=Start.coll;i>0&&Matrix[TempColl-1][Start.row]=='.'&&i>Target.coll;i--){Start.coll--;}//부딪힌게 같은 A인가 확인, A이면if(Start.coll-1==Target.coll&&Start.row==Target.row){returntrue;}//아래for(inti=Start.coll;i<Col&&Matrix[Start.coll+1][Start.row]=='.'&&i<Target.coll;i++){Start.coll++;}//부딪힌게 같은 A인가 확인, A이면if(Start.coll+1==Target.coll&&Start.row==Target.row){returntrue;}//중간값 불름Start.coll=TempColl;Start.row=TempRow;//왼쪽for(inti=Start.row;i>0&&Matrix[Start.coll][Start.row-1]=='.'&&i>Target.row;i--){Start.row--;}if(Start.coll==Target.coll&&Start.row-1==Target.row){returntrue;}//위for(inti=Start.coll;i>0&&Matrix[TempColl-1][Start.row]=='.'&&i>Target.coll;i--){Start.coll--;}//부딪힌게 같은 A인가 확인, A이면if(Start.coll-1==Target.coll&&Start.row==Target.row){returntrue;}//아래for(inti=Start.coll;i<Col&&Matrix[Start.coll+1][Start.row]=='.'&&i<Target.coll;i++){Start.coll--;}//부딪힌게 같은 A인가 확인, A이면if(Start.coll-1==Target.coll&&Start.row==Target.row){returntrue;}}Start.row=SourceRow;Start.coll=SourceColl;//처음값 불러오기//아래쪽 체크if((Start.coll+1<=Col&&Matrix[Start.coll+1][Start.row]=='.')||(Start.row==Target.row&&Start.coll+1==Target.coll)){if(Start.row==Target.row&&Start.coll+1==Target.coll)returntrue;//아래for(inti=Start.coll;i<Col&&Matrix[Start.coll+1][Start.row]=='.';i++){Start.coll++;}//부딪힌게 같은 A인가 확인, A이면if(Start.coll+1==Target.coll&&Start.row==Target.row){returntrue;}//중간값 저장TempColl=Start.coll;TempRow=Start.row;//왼for(inti=Start.row;i>0&&Matrix[Start.coll][Start.row-1]=='.'&&i>Target.row;i--){Start.row--;}if(Start.coll==Target.coll&&Start.row-1==Target.row){returntrue;}//위for(inti=Start.coll;i>0&&Matrix[TempColl-1][Start.row]=='.'&&i>Target.coll;i--){Start.coll--;}//부딪힌게 같은 A인가 확인, A이면if(Start.coll-1==Target.coll&&Start.row==Target.row){returntrue;}//아래for(inti=Start.coll;i<Col&&Matrix[Start.coll+1][Start.row]=='.'&&i<Target.coll;i++){Start.coll++;}//부딪힌게 같은 A인가 확인, A이면if(Start.coll+1==Target.coll&&Start.row==Target.row){returntrue;}//중간값 불러오기Start.coll=TempColl;Start.row=TempRow;//오른쪽for(inti=Start.row;i<Row&&Matrix[Start.coll][Start.row+1]=='.'&&i<Target.row;i++){Start.row++;}if(Start.coll==Target.coll&&Start.row+1==Target.row){returntrue;}for(inti=Start.coll;i>0&&Matrix[TempColl-1][Start.row]=='.'&&i>Target.coll;i--){Start.coll--;}//부딪힌게 같은 A인가 확인, A이면if(Start.coll-1==Target.coll&&Start.row==Target.row){returntrue;}//아래for(inti=Start.coll;i<Col&&Matrix[Start.coll+1][Start.row]=='.'&&i<Target.coll;i++){Start.coll++;}//부딪힌게 같은 A인가 확인, A이면if(Start.coll+1==Target.coll&&Start.row==Target.row){returntrue;}}returnfalse;}
문단을 구분하기 위해 앞과 뒤에 빈 줄 하나씩을 반드시 추가하셔야 합니다.
마지막으로 자주_하는_실수_모음 페이지를 읽으시면서 혹시 해당되는 사항이 있진 않은지 생각해 보세요.
susul89
사천성 문제인데요...
RTE (SIGSEGV: segmentation fault, probably incorrect memory access or stack overflow)\
오류가 발상합니다. 비주얼스투디오로 컴파일 할때는
오류없이 답이 잘 출력이 되는데요...
어느부분이 문제인지 모르겠습니다.
알고리즘이 길어서 조금 설명을 해 드리면
문자가 있는 좌표값을 각각 받아서
같은 문자가 있는 곳 까지 3번안에 가는 방법을 검색합니다
'.'이아니거나 사천성 크기의 제일 끝으로 가게되면
그 부딪힌 부분이 자신과 맞는 문자쌍인지 확인을 하고
아니면 모든 경우의 수를 또 확인해 나갑니다.
+한가지 질문을 더 드리자면
너무 알고르짐이 길어지고, 단순하게 모든 경우의 수를
확인하는 알고리즘이 되었는데 뭔가 찝찝하네요
저의 접근방향이 잘못된 것인가요?
문단을 구분하기 위해 앞과 뒤에 빈 줄 하나씩을 반드시 추가하셔야 합니다.
마지막으로 자주_하는_실수_모음 페이지를 읽으시면서 혹시 해당되는 사항이 있진 않은지 생각해 보세요.
위 내용이 지켜지지 않은 질문은 답변이 오래 걸릴 수 있습니다.
아래 '편집하기' 버튼을 눌러 글을 쓰실 수 있습니다.
9년 전