커 리 어 컵 - 중간 난제 17.2
9827 단어 UP
해법:
만약 에 이 검사 에서 누군가가 우물 글자 게임 의 함 수 를 HasWon 으로 이 겼 는 지 확인한다 면 우 리 는 첫 번 째 단 계 는 면접 관 에 게 이 함수 가 한 번 만 호출 되 는 지, 아니면 여러 번 자주 호출 되 는 지 확인 해 야 한다.만약 여러 번 호출 된다 면, 우 리 는 예비 처 리 를 통 해 매우 빠 른 버 전 을 얻 을 수 있다.
방법 1: HasWon 함수 가 자주 호출 되 어야 한다 면
우물 글자 놀이 에 있어 서, 각 칸 이 비어 있 을 수 있 습 니 다. 나의 바둑 알 과 상대방 의 바둑 알 은 세 가지 가능성 이 있 습 니 다. 모두 39 가 있 습 니 다. = 19683 가지 가능 한 상태.우 리 는 모든 상 태 를 하나의 정수 로 바 꿀 수 있다. 예비 처리 할 때 이 상태 에서 우물 글자 게임 을 이 긴 사람 이 있 는 지 를 저장 할 수 있다. 검색 할 때마다 O (1) 시간 만 필요 하 다.예 를 들 어 각 칸 의 3 가지 상 태 는 0 (공), 1 (우리 측 바둑돌), 2 (상대방 바둑돌) 이 고 바둑판 은 왼쪽 에서 오른쪽으로, 위 에서 아래로 0 에서 8 로 순서대로 기록 하면 모든 상 태 는 3 진법 의 숫자 로 쓰 고 10 진법 으로 바 꾸 면 된다.예 를 들 어 아래 의 상태:
1 2 2
2 1 1
2 0 1
:
122211201=1*3^8 + 2*3^7 +...+ 0*3^1 + 1*3^0
이때 계 산 된 정 수 를 어느 쪽 이 이 겼 거나 무승부 가 났 는 지 표시 하기 위해 서 는 19683 개의 배열 이 필요 하 다.
만약 누군가가 이 겼 는 지 안 이 겼 는 지 를 되 돌려 야 한다 면, 우리 측 인지 상대방 인지 알 필요 가 없다.그것 은 이 긴 사람 이 있 는 지 없 는 지 를 바 이 너 리 로 표시 할 수 있다.예 를 들 어 위의 상태 에서 1 을 이기 면 그 상 태 를 대응 하 는 위치 1 로 바 꿀 수 있다.누가 이 겼 는 지 알 고 싶다 면, 전처리 결 과 를 char 배열 로 저장 할 수 있다.
방법 2: HasWon 함수 가 한 번 만 호출 되 거나 적 으 면
만약 에 HasWon 함수 가 한 번 만 호출 되 거나 아주 적 게 호출 된다 면 우 리 는 결 과 를 미리 저장 할 필요 가 없고 직접 판단 하면 된다.단지 한 번 의 호출 을 위해 예비 처 리 를 하 는 것 은 가치 가 없다.
코드 는 다음 과 같 습 니 다. n * n 의 바둑판 이 이 기 는 지 여 부 를 판단 합 니 다. 즉, 같은 바둑판 이 한 줄 로 연결 되 는 것 입 니 다.
위 에서 아래로, 왼쪽 에서 오른쪽으로, 두 대각선.
C + + 구현 코드:
#include<vector>
#include<iostream>
using namespace std;
int convertBoardToInt(vector<vector<char> > &board)
{
int factor=1;
int sum=0;
int i,j;
int v;
for(i=0; i<3; i++)
for(j=0; j<3; j++)
{
v=0;
if(board[i][j]=='X')
v=1;
if(board[i][j]=='O')
v=2;
sum+=v*factor;
factor*=3;
}
return sum;
}
char hasWon(vector<vector<char> > &board)
{
int i,j;
int n=board.size();
//
for(i=0; i<n; i++)
{
for(j=0; j<n-1; j++)
{
if(board[i][j]!=board[i][j+1])
break;
}
if(j==n-1)
return board[i][j];
}
//
for(j=0; j<n; j++)
{
for(i=0; i<n-1; i++)
{
if(board[i][j]!=board[i+1][j])
break;
}
if(i==n-1)
return board[i][j];
}
//
for(j=0; j<n-1; j++)
{
if(board[j][j]!=board[j+1][j+1])
break;
}
if(j==n-1)
return board[j][j];
for(i=0; i<n-1; i++)
if(board[i][n-i-1]!=board[i+1][n-i-2])
break;
if(i==n-1)
return board[i][0];
return board.empty();
}
int main()
{
vector<vector<char> > vec={{'X','X','O'},{'X','X','O'},{'X','O','O'}};
cout<<hasWon(vec)<<endl;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
개인 FLEX 지식 라이브러리 작업 노트[size=large]1、 이 방법은 TileWindows 팝업 창에 있습니다. TitleWindows의 maxWidth와 maxHeight를 지정하지 않으면 최대 값이 화면 전체에 깔립니다. 페이지의minHeigh...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.