Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
5.4 kB
2
Indexable
Never
Bộ xử lý di động Maxinos mới được phát triển của Samsung có số ô N x N.
Trong 1 cell có thể có 1 lõi hoặc 1 dây dẫn điện.
Năng lượng điện chạy trên rìa của Maxinos.
Dây kết nối lõi và nguồn chỉ có thể được cài đặt theo một đường thẳng.
Dây không thể giao nhau với nhau.
Tình trạng ban đầu của Maxinos  trước khi nối dây được đưa ra như bên dưới.
(Các Lõi bên lề của Maxinos được coi là đã được kết nối với nguồn điện.)
Khi số Lõi tối đa được kết nối với nguồn điện, hãy tìm tổng chiều dài của dây. 

Tuy nhiên, nếu có nhiều phương án khác nhau, hãy tìm giá trị nhỏ nhất của tổng chiều dài của dây.
Câu trả lời cho bài tập trên là 12.

[Những hạn chế]
1. 7  ≤  N  ≤  12
2. Số Lõi lớn hơn hoặc bằng 1 và nhỏ hơn hoặc bằng 12 (1  ≤   N  ≤  12).
3. Có thể có Lõi không được kết nối với nguồn, mặc dù người ta có thể cố gắng kết nối nó với nguồn càng nhiều càng tốt.

[Đầu vào]
Dòng đầu tiên chứa T là số lượng test.
Các trường hợp thử nghiệm được đưa ra bắt đầu từ dòng tiếp theo.
Dòng đầu tiên của mỗi test có N, và trong N dòng tiếp theo là điều kiện ban đầu của Maxinos  , được cho trong mảng N x N.
0 biểu thị một ô trống và 1 biểu thị Lõi và không có số nào khác được đưa ra.

[Đầu ra]
In  ' #tc '  cho mỗi trường hợp kiểm tra và để lại một khoảng trống và in câu trả lời.
(tc đề cập đến một số trường hợp thử nghiệm và nó bắt đầu bằng 1)

Ví dụ đầu vào

Ví dụ đầu ra

3 // Số lượng test, T = 3

7 // TC 1, N = 7

0 0 1 0 0 0 0

0 0 1 0 0 0 0

0 0 0 0 0 1 0

0 0 0 0 0 0 0

1 1 0 1 0 0 0

0 1 0 0 0 0 0

0 0 0 0 0 0 0

9 // TC 2, N = 9

0 0 0 0 0 0 0 0

0 0 1 0 0 0 0 0 1

1 0 0 0 0 0 0 0

0 0 0 1 0 0 0 0

0 1 0 0 0 0 0 0

0 0 0 0 0 0 1 0 0

0 0 0 1 0 0 0 0

0 0 0 0 0 0 0 1 0

0 0 0 0 0 0 0 0 1

11 // TC 3, N = 11

0 0 1 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 1

0 0 0 1 0 0 0 0 1 0 0

0 1 0 1 1 0 0 0 1 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 1 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 1 0 0

0 0 0 0 0 0 1 0 0 0 0

0 0 0 0 0 0 0 0 0 0

#1 12 // Đầu ra của  TC thứ 1

#2 10 // Đầu ra của TC  thứ 2

#3 24 // Đầu ra của TC  thứ 3

INPUT

#include<iostream>
#include<conio.h>
// code 100/100
// Backtrack (trả lại visit)

using namespace std;
int tc,n,map[12][12], visited[12][12];
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1}; // trên, phải, xuống, trái
int chip[2][12], minn=987654,cnt=0,dai=0;

bool checkMap(int x, int y){
    return (x<n && y<n && x>=0 && y>=0);
}

bool checkHuong (int x, int y, int hgx, int hgy){
	int tempx = x+hgx;
	int tempy = y+hgy;
	while(checkMap(tempx,tempy)){
		if(visited[tempx][tempy]==1){
			return false;
		}
		tempx += hgx;
		tempy += hgy;
	}
	return true;
}
void visit(int x, int y, int hgx, int hgy, int val){
	int tempx = x+hgx;
	int tempy = y+hgy;
    dai=0;
    while(checkMap(tempx,tempy) && map[tempx][tempy]==0){
        dai++;
        visited[tempx][tempy]+=val; // đánh dấu ô đã đi qua
		tempx += hgx;
		tempy += hgy;
    }
}
void BT(int xx,int sum){ // chip, sum
    if(sum>minn) return;
    if(xx==cnt){
        if(sum<minn) minn=sum;
        return;
    }
    int x=chip[0][xx];
    int y=chip[1][xx];
    if(x==-1 && y==-1){ // chip(-1,-1) là ko thể nối nguồn
        BT(xx+1,sum);
    }
    else{
        for(int i=0;i<4;i++){ // đi 4 hướng
            if(checkHuong(x,y,dx[i],dy[i]) ){
                visit(x,y,dx[i],dy[i],1);
                BT(xx+1,sum+dai);
                visit(x,y,dx[i],dy[i],-1); // trả lại visit
            }
        }
        return;
    }
}
int main(){
    freopen("input.txt","r",stdin);
    cin>>tc;
    for(int t=1;t<=tc;t++){
        cin>>n;
        minn=987654;
        cnt=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                visited[i][j]=0;
                cin>>map[i][j];
                if(map[i][j]==1){
                    if(i==0 || i==n-1 || j==0 ||j==n-1){}
                    else { // chỉ lưu các chip trong bo
                        chip[0][cnt]=i;
                        chip[1][cnt]=j;
                        cnt++;
                    }
                    visited[i][j]=1;
                }
            }
        }
        for(int i=0;i<cnt;i++){ // check tất cả các chip theo 4 hướng
            bool ch[4];
            for(int j=0;j<4;j++){ // check 4 hướng cửa chip
                ch[j]=checkHuong(chip[0][i],chip[1][i],dx[j],dy[j]);
            }
            if(!ch[0] && !ch[1] && !ch[2] && !ch[3] ){ // chip ko đi được hướng nào cả
                chip[0][i]=-1;
                chip[1][i]=-1;
            }
        }
        BT(0,0);
        if(minn==987654) cout<<"#"<<t<< " "<<0<<endl;
        else {
            cout<<"#"<<t<<" "<<minn<<endl;
        }
    }
	getch();
    return 0;
}