ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 배열 돌리기 4
    백준알고리즘 2019. 8. 13. 22:10
    #include<iostream>
    #include<vector>
    #include<algorithm>
    #include<cstdlib>
    #include<cstring>
    
    using namespace std;
    
    struct rot {
    	int r, c, s;
    };
    int n, m, k;
    int map[51][51];
    int temp[51][51];
    rot rotat[6];
    int ans = 10000;
    //x1 작은거 x2큰거 y1작은거 y2큰거
    void rotation(int x1, int y1, int x2, int y2) {
    	if (x1 == x2 && y1 == y2) {
    		return;
    	}
    	int temp = map[x1][y1];
    	//y1고정
    	for (int i = x1; i < x2; i++) {
    		map[i][y1] = map[i+1][y1];
    	}
    	int temp2 = map[x1][y2];
    	for (int i = y2 -1 ; i >= y1; i--) {
    		if (i == y1)
    			map[x1][i + 1] = temp;
    		else map[x1][i + 1] = map[x1][i];
    	}
    	//y2 고정
    	temp = map[x2][y2];
    	for (int i = x2; i > x1; i--) {
    		if (i == x1 + 1) {
    			map[i][y2] = temp2;
    		}
    		else map[i][y2] = map[i-1][y2];
    	}
    	
    	for (int i = y1; i < y2; i++) {
    		if (i == y2 - 1) {
    			map[x2][i] = temp;
    		}
    		else
    		{
    			map[x2][i] = map[x2][i + 1];
    		}
    	}
    	rotation(x1 + 1, y1 + 1, x2 - 1, y2 - 1);
    }
    
    
    int main() {
    	cin >> n >> m >> k;
    	for (int i = 1; i <= n; i++) {
    		for (int j = 1; j <= m; j++) {
    			cin >> map[i][j];
    			temp[i][j] = map[i][j];
    		}
    	}
    
    	for (int i = 0; i < k; i++) {
    		int r, c, s;
    		cin >> r >> c >> s;
    		rotat[i].r = r;
    		rotat[i].c = c;
    		rotat[i].s = s;
    	}
    	
    
    	vector<int> u;
    	for (int i = 0; i < k; i++) {
    		u.push_back(i);
    	}
    	do {
    		memcpy(map, temp, sizeof(map));
    		for (int i = 0; i < k; i++) {
    			rotation(rotat[u[i]].r - rotat[u[i]].s, rotat[u[i]].c - rotat[u[i]].s, rotat[u[i]].r + rotat[u[i]].s, rotat[u[i]].c + rotat[u[i]].s);
    		}
    		/*cout << endl;
    		for (int i = 1; i <= n; i++) {
    			for (int j = 1; j <= m; j++) {
    				cout << map[i][j] << " ";
    			}
    			cout << endl;
    		}*/
    		for (int i = 1; i <= n; i++) {
    			int temp = 0;
    			for (int j = 1; j <= m; j++) {
    				temp += map[i][j];
    			}
    			if (temp < ans) ans = temp;
    		}
    	} while (next_permutation(u.begin(), u.end()));
    
    	cout <<ans<< endl;
    	
    	return 0;
    
    
    }

    A형 비슷한문제 하나나왔다고해서 풀어본 문제,

    그냥 돌리는함수 하나, 메인에서 행 세는 부분 하나,

    그리고 -> do{}while로 순열돌리면서 전수조사해보기

    양자체가 그리많지않아(돌리는횟수 6)개 정도 여서 해볼만했던것같음

    '백준알고리즘' 카테고리의 다른 글

    다리만들기  (0) 2019.08.14
    뿌요뿌요  (0) 2019.08.14
    연구소 3  (0) 2019.08.11
    종이조각  (0) 2019.08.11
    스도쿠 재풀이  (0) 2019.08.10

    댓글

Designed by Tistory.