Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- using namespace std;
- const int MAX = 25;
- int t, d, w, k, result, num[MAX], map[MAX][MAX], data[MAX][MAX];
- bool flag, check[MAX];
- bool checkK() {
- int cnt = 1, sum = 0;
- for(int i=1;i<=w;i++) {
- int inx = data[1][i];
- cnt = 1;
- for(int j=2;j<=d;j++) {
- if(data[j][i] == inx) cnt++;
- else {
- if(j == d - k + 2) break;
- inx = data[j][i];
- cnt = 1;
- }
- if(cnt >= k) {
- sum++;
- break;
- }
- }
- if(sum != i) return false;
- }
- return true;
- }
- void getNum(int x, int n) {
- if(flag) return;
- if(x == n) {
- if(checkK()) {
- result = n;
- flag = true;
- }
- }
- else {
- int arr[MAX] = {0,}, a_inx = 0;
- for(int i=1;i<=d;i++) {
- if(!check[i]) {
- num[x] = i;
- check[i] = true;
- arr[a_inx++] = i;
- for(int j=1;j<=w;j++) {
- data[num[x]][j] = 0;
- }
- getNum(x+1, n);
- for(int j=1;j<=w;j++) {
- data[num[x]][j] = 1;
- }
- getNum(x+1, n);
- for(int j=1;j<=w;j++) {
- data[num[x]][j] = map[num[x]][j];
- }
- num[x] = 0;
- }
- }
- for(int i=0;i<a_inx;i++) check[arr[i]] = false;
- }
- }
- int main() {
- scanf("%d", &t);
- for(int v=1;v<=t;v++) {
- scanf("%d %d %d", &d, &w, &k);
- for(int i=1;i<=d;i++) {
- for(int j=1;j<=w;j++) {
- scanf("%d", &map[i][j]);
- data[i][j] = map[i][j];
- }
- }
- if(k != 1) {
- if(!checkK()){
- int cnt =1;
- while(!flag) {
- getNum(0, cnt);
- cnt++;
- }
- for(int i=1;i<=d;i++) check[i] = false;
- }
- }
- printf("#%d %d\n", v, result);
- result = 0, flag = false;
- for(int i=1;i<=d;i++) {
- for(int j=1;j<=w;j++) {
- map[i][j] = 0;
- data[i][j] = 0;
- }
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement