예제도 많이 입력해봤는데 자꾸 오답이 나오네요 흑흑
대체 어떤부분에서 오답이 나오는건지 모르겠어요 ㅠㅠ
제가 설정한 케이스는요:
1. 붙어있을때 세로/가로
2. 1자로 움직일때 세로/가로
그리고 장애물이 있어서 1자로 못움직일때 [ 모양과 ] 모양
그리고 그 모양을 90도 돌린 모양
3. ㄴ 모양 ㄱ 모양으로 움직일때
4. ㄴ 모양 ㄱ 거울로 비추었을때 모양으로 움직일때
5. 좌표1 과 좌표2 사이에서 움직이는데..
아래 오른쪽 아래
오른쪽 아래 오른쪽
위 오른쪽 위
오른쪽 위 오른쪽
(오른쪽에있는게 무조건 두번째 좌표로 설정됨으로서 좌측으로 움직이는건 생략)
6. 좌표1과 좌표2 바깥으로 움직이는데
[ 모양과 ] 모양 근데 비대칭.
위 모양을 90도 돌린모양.
이 정도면 모든 케이스를 잡았다고 생각하거든요
그런데 어느부분에서 오류가 나는건지 자꾸 오답이 뜨네요
처음부터 코드를 작성하는걸 고려해봐야할까요
어떤 케이스에서 오류가 뜨는건지.. 도움 부탁드립니다.
#include <iostream>#include <string>#include <vector>#include <algorithm>usingnamespacestd;classGame{classItem{public:intx;inty;charitemType;Item(inty,intx,charitemType);};classBoard{public:intwidth;intheight;char**map;vector<char>itemTypes;vector<Item>items;Board(intw,inth);voidsetItem(inty,intx,charitemType);boolisOpen(inty1,intx1,inty2,intx2);boolhasRoute(inty1,intx1,inty2,intx2);intgetDifficulty();voiddispose();~Board();};public:vector<Board>boards;Game();~Game();voidreadInput();voidprocess();};Game::Item::Item(inty,intx,charitemType){this->y=y;this->x=x;this->itemType=itemType;}Game::Board::Board(intw,inth){width=w;height=h;map=newchar*[h];for(inti=0;i<h;i++){map[i]=newchar[w];for(intj=0;j<w;j++){map[i][j]='.';}}}voidGame::Board::setItem(inty,intx,charitemType){// IF ITEM IS NEW, ADD IT TO itemTypes VECTOR;if(find(itemTypes.begin(),itemTypes.end(),itemType)==itemTypes.end()){itemTypes.push_back(itemType);}Itemitem(y,x,itemType);items.push_back(item);map[y][x]=itemType;}boolGame::Board::isOpen(inty1,intx1,inty2,intx2){if(y1==y2){if(x1>x2){swap(x1,x2);swap(y1,y2);}if(x2-x1==1){if(map[y1][x1]=='.'&&map[y2][x2]!='.'||map[y1][x1]!='.'&&map[y2][x2]=='.'||map[y1][x1]=='.'&&map[y2][x2]=='.'){returntrue;}else{returnfalse;}}for(inti=x1+1;i<x2;i++){if(map[y1][i]!='.')returnfalse;}returntrue;}if(x1==x2){if(y1>y2){swap(x1,x2);swap(y1,y2);}if(y2-y1==1){if(map[y1][x1]=='.'&&map[y2][x2]!='.'||map[y1][x1]!='.'&&map[y2][x2]=='.'){returntrue;}else{returnfalse;}}for(inti=y1+1;i<y2;i++){if(map[i][x1]!='.')returnfalse;}returntrue;}}boolGame::Board::hasRoute(inty1,intx1,inty2,intx2){// CASE 1 : x1 == x2if(x1==x2){// 1.0 STICKEDif(y2-y1==1||y2-y1==-1){returntrue;}// 1.1 NO OBSTACLEif(isOpen(y1,x1,y2,x2)){return1;}// 1.2 HAS OBSTACLEinti=1;// 1.2.1 LEFT HAND EMPTYwhile(map[y1][x1-i]=='.'&&map[y2][x1-i]=='.'&&x1-i>-1){if(isOpen(y1,x1-i,y2,x1-i)){return1;}i++;}i=1;// 1.2.2 RIGHT HAND EMPTYwhile(map[y1][x1+i]=='.'&&map[y2][x1+i]=='.'&&x1+i<width){if(isOpen(y1,x1+i,y2,x1+i)){return1;}i++;}return0;}// CASE 2 : y1 == y2if(y1==y2){if(x2-x1==1||x2-x1==-1){returntrue;}// 2.1 NO OBSTACLEif(isOpen(y1,x1,y2,x2)){return1;}// 2.2 HAS OBSTACLEinti=1;// 2.2.1 UP HAND EMPTYwhile(map[y1-i][x1]=='.'&&map[y1-i][x2]=='.'&&y1-i>-1){if(isOpen(y1-i,x1,y1-i,x2)){return1;}i++;}i=1;// 2.2.2 DOWN HAND EMPTYwhile(map[y1+i][x1]=='.'&&map[y1+i][x2]=='.'&&y1+i<height){if(isOpen(y1+i,x1,y1+i,x2)){return1;}i++;}return0;}// CASE 3 : MOVING DIAGONALLY// SWAP IF X2 AT LEFTif(x1>x2){inttempX=x1;inttempY=y1;x1=x2;y1=y2;x2=tempX;y2=tempY;}// CASE 3.1 RIGHT AND DOWNif(y2>y1){// 3.1.1 DOWN THEN RIGHTif(map[y1+1][x1]=='.'&&map[y2][x2-1]){if(isOpen(y1,x1,y2,x1))if(isOpen(y2,x1,y2,x2)){return1;}}// 3.1.2 RIGHT THEN DOWNif(map[y1][x1+1]=='.'&&map[y2-1][x2]){if(isOpen(y2,x1,y1,x2))if(isOpen(y1,x2,y2,x2)){return1;}}//3.1.3 DOWN RIGHT DOWNif(map[y1+1][x1]=='.'&&map[y2-1][x2]=='.'){inta=1;while(map[y1+a][x1]=='.'&y1+a<y2){if(isOpen(y1+a,x1,y1+a,x2))if(isOpen(y1+a,x2,y2,x2)){return1;}a++;}}// 3.1.4 RIGHT DOWN RIGHTif(map[y1][x1+1]=='.'&&map[y2][x2-1]=='.'){inta=1;while(map[y1][x1+a]=='.'&&x1+a<x2){if(isOpen(y1,x1+a,y2,x1+a))if(isOpen(y2,x1+a,y2,x2)){return1;}a++;}}// return 0;}else{// CASE 3.2 RIGHT AND UP// 3.2.1 RIGHT UPif(map[y1][x1+1]=='.'&&map[y2+1][x2]){if(isOpen(y1,x1,y1,x2))if(isOpen(y1,x2,y2,x2)){return1;}}// 3.2.2 UP RIGHTif(map[y1-1][x1]=='.'&&map[y2][x2-1]){if(isOpen(y1,x1,y2,x1))if(isOpen(y2,x1,y2,x2)){return1;}}// 3.2.3 UP RIGHT UPif(map[y1-1][x1]=='.'&&map[y2+1][x2]=='.'){inta=1;while(map[y1-a][x1]=='.'&&y1-a>y2){if(isOpen(y1-a,x1,y1-a,x2))if(isOpen(y1-a,x2,y2,x2)){return1;}a++;}}// 3.2.4 RIGHT UP RIGHTif(map[y1][x1+1]=='.'&&map[y2][x2-1]=='.'){inta=1;while(map[y1][x1+a]=='.'&&x1+a<x2){if(isOpen(y1,x1+a,y2,x1+a))if(isOpen(y2,x1+a,y2,x2)){return1;}a++;}}// return 0;}// CASE 4 EXCEED/RECEDE AXIS VALUE// CASE 4.1 EXCEED X2 VALUE: RIGHT DOWN LEFTif(isOpen(y1,x1,y1,x2)){inta=1;while(map[y1][x2+a]=='.'&&map[y2][x2+a]=='.'&&x2+a<width){if(isOpen(y1,x2+a,y2,x2+a))return1;a++;if(x2+a>width)break;}}// CASE 4.2 RECEDE X1 VALUE : LEFT DOWN RIGHTif(isOpen(y2,x2,y2,x1)){inta=1;while(map[y1][x1-a]=='.'&&map[y2][x1-a]=='.'&&x1-a>=0){if(isOpen(y1,x1-a,y2,x1-a))return1;a++;if(x1-a==-1)break;}}// ONE AT THE BOTTOM IS ALWAYS POINT2if(y1>y2){swap(y1,y2);swap(x1,x2);}// CASE 4.3 RECEDE Y1: UP RIGHT DOWNif(isOpen(y2,x2,y1,x2)){inta=1;while(map[y1-a][x1]=='.'&&map[y1-a][x2]=='.'&&y1-a>=0){if(isOpen(y1-a,x1,y1-a,x2))returntrue;a++;if(y1-a==-1)break;}}// CASE 4.4 EXCEED Y2 : DOWN RIGHT UPif(isOpen(y1,x1,y2,x1)){inta=1;while(y2+a<height){if(map[y2+a][x1]!='.'||map[y2+a][x2]!='.')break;if(isOpen(y2+a,x1,y2+a,x2))returntrue;a++;}}return0;}intGame::Board::getDifficulty(){intdifficulty=0;for(charitemType:itemTypes){// cout << itemType << endl;// STORE SAME ITEMS IN VECTORvector<Item>sameItems;for(Itemitem:items){if(item.itemType==itemType){sameItems.push_back(item);}}for(inti=0;i<sameItems.size()-1;i++){for(intj=i+1;j<sameItems.size();j++){ItemfirstItem=sameItems[i];ItemsecondItem=sameItems[j];/* cout << firstItem.x << firstItem.y << firstItem.itemType << ":"; cout << secondItem.x << secondItem.y << secondItem.itemType << " " << hasRoute(firstItem.y, firstItem.x, secondItem.y, secondItem.x) << endl; */if(hasRoute(firstItem.y,firstItem.x,secondItem.y,secondItem.x))difficulty++;}}}returndifficulty;}voidGame::Board::dispose(){for(inti=0;i<height;i++){delete[]map[i];}delete[]map;}Game::Board::~Board(){}Game::Game(){}Game::~Game(){for(inti=0;i<boards.size();i++){boards[i].dispose();}}voidGame::readInput(){inttc=0;// TEST CASE COUNTcin>>tc;for(inti=0;i<tc;i++){intw=0,h=0;// MAP SIZEcin>>h>>w;cin.ignore();Boardboard(w,h);// CREATE BOARD// READ MAPfor(intj=0;j<h;j++){stringline;getline(cin,line);for(intk=0;k<w;k++){if(line.at(k)!='.'){board.setItem(j,k,line.at(k));}}}boards.push_back(board);}}voidGame::process(){for(Boardb:boards){cout<<b.getDifficulty()<<endl;}}intmain(){Gamegame;game.readInput();game.process();}
velopert
일주일동안 잡고 있었는데
도저히 모르겠네요. 진짜 열심히 디버깅 했는데..
미로찾기 방식으로 하려니 모르겠어서 루트가 되는 각 케이스를 나누어서
진행하게끔 했는데요
예제도 많이 입력해봤는데 자꾸 오답이 나오네요 흑흑
대체 어떤부분에서 오답이 나오는건지 모르겠어요 ㅠㅠ
제가 설정한 케이스는요:
1. 붙어있을때 세로/가로
2. 1자로 움직일때 세로/가로
그리고 장애물이 있어서 1자로 못움직일때 [ 모양과 ] 모양
그리고 그 모양을 90도 돌린 모양
3. ㄴ 모양 ㄱ 모양으로 움직일때
4. ㄴ 모양 ㄱ 거울로 비추었을때 모양으로 움직일때
5. 좌표1 과 좌표2 사이에서 움직이는데..
아래 오른쪽 아래
오른쪽 아래 오른쪽
위 오른쪽 위
오른쪽 위 오른쪽
(오른쪽에있는게 무조건 두번째 좌표로 설정됨으로서 좌측으로 움직이는건 생략)
6. 좌표1과 좌표2 바깥으로 움직이는데
[ 모양과 ] 모양 근데 비대칭.
위 모양을 90도 돌린모양.
이 정도면 모든 케이스를 잡았다고 생각하거든요
그런데 어느부분에서 오류가 나는건지 자꾸 오답이 뜨네요
처음부터 코드를 작성하는걸 고려해봐야할까요
어떤 케이스에서 오류가 뜨는건지.. 도움 부탁드립니다.
제 테스트케이스에요.
문제없이 작동하던데..
8년 전