백준 4920 테트리스 게임

문제 출처 :
https://www.acmicpc.net/problem/4920

테트리스는 아래와 같은 5가지 조각으로 이루어져 있다.

N*N 정수 표가 주어졌을때 해당 조각을 이용해 얻을 수 있는 정수 합중 가장 큰 것을 출력하는 문제이다. 첫번째 조각은 90도로 회전했을때 나올 수 있는 가지수가 2개이고, 두번째 조각도 2개, 세번째 네번째는 4개 다섯번째는 1개로 총 13개이다. 해당조각이 N*N 정수표에 들어 갈 수 있는지 완전탐색으로 확인하는 방법으로 해결할 수 있다.

소스코드 :

#include <bits/stdc++.h>

using namespace std;

int dx[13][4] = {{0,1,2,3}, {0,0,0,0}, {0,1,1,2}, {0,0,-1,-1}, {0,1,2,2}, {0,0,0,-1}, {0,0,1,2}, {0,1,0,0}, {0,1,1,1}, {0,-1,0,1}, {0,0,0,1}, {0,-1,1,0}, {0,1,0,1}}; 
int dy[13][4] = {{0,0,0,0}, {0,-1,-2,-3}, {0,0,-1,-1}, {0,-1,-1,-2}, {0,0,0,-1}, {0,-1,-2,-2}, {0,-1,-1,-1}, {0,0,-1,-2}, {0,1,0,-1}, {0,-1,-1,-1}, {0,-1,-2,-1}, {0,0,0,-1}, {0,0,-1,-1}};

int main(){
  // freopen("Input.txt", "r", stdin);
  int N,score,nx,ny;
  vector<int> result;
  while(1){
    cin>>N;
    if(N == 0)break;
    vector<vector<int>> scores(N,vector<int>(N));
    for(int i =0;i<N;i++){
      for(int j =0;j<N;j++){
        cin>>scores[i][j];
      }
    }
    score = INT_MIN;
    for(int i=0;i<N;i++){
      for(int j=0;j<N;j++){
        for(int y=0;y<13;y++){
          bool flag = true;
          int temp=0;
          for(int k=0;k<4;k++){
            nx = i+dx[y][k];
            ny = j+dy[y][k];
            if(nx>=0 && nx<N && ny>=0 && ny<N){
              temp+=scores[nx][ny];
            }
            else{
              flag = false;
              break;
            }
          }
          if(flag) score = max(score,temp);
        }
      }
    }
    result.push_back(score);
  }
  for(int i = 0; i<result.size(); i++){
    cout<<i+1<<". "<<result[i]<<endl;
  }
  return 0;
}

좋은 웹페이지 즐겨찾기