특수 행렬 연산
사고방식: 거슬러 올라가는 법.특수한 연산을 할 수 있는 모든 위치를 일일이 열거하여 귀속시키고, 원소가 0보다 작은 상황이 발생하면 거슬러 올라간다.매번 0 행렬을 판단하지 않고 계수 변수 cnt를 유지하고 현재 행렬의 비 0 원소 개수를 통계합니다.특수 연산을 진행할 때마다 cnt의 값을 업데이트합니다
코드(효율이 낮으므로 더욱 최적화할 수 있어야 함):
int ok; // ,
void process(int ** a, int n, int m, int cnt){
if(cnt == 0) ok = 1;
else{
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(a[i][j]-1 >= 0){ //
a[i][j]--;
if(i-1 >= 0 && a[i-1][j]-1 >= 0){
a[i-1][j]--;
if(a[i][j] == 0 && a[i-1][j] == 0) process(a, n, m, cnt-2);
else if(a[i][j]*a[i-1][j] == 0 && a[i][j]+a[i-1][j] != 0) process(a, n, m, cnt-1);
else process(a, n, m, cnt);
a[i-1][j]++;
}
if(i+1 < n && a[i+1][j]-1 >= 0){
a[i+1][j]--;
if(a[i][j] == 0 && a[i+1][j] == 0) process(a, n, m, cnt-2);
else if(a[i][j]*a[i+1][j] == 0 && a[i][j]+a[i+1][j] != 0) process(a, n, m, cnt-1);
else process(a, n, m, cnt);
a[i+1][j]++;
}
if(j-1 >= 0 && a[i][j-1]-1 >= 0){
a[i][j-1]--;
if(a[i][j] == 0 && a[i][j-1] == 0) process(a, n, m, cnt-2);
else if(a[i][j]*a[i][j-1] == 0 && a[i][j]+a[i][j-1] != 0) process(a, n, m, cnt-1);
else process(a, n, m, cnt);
a[i][j-1]++;
}
if(j+1 < m && a[i][j+1]-1 >= 0){
a[i][j+1]--;
if(a[i][j] == 0 && a[i][j+1] == 0) process(a, n, m, cnt-2);
else if(a[i][j]*a[i][j+1] == 0 && a[i][j]+a[i][j+1] != 0) process(a, n, m, cnt-1);
else process(a, n, m, cnt);
a[i][j+1]++;
}
a[i][j]++; //
}
}
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
하나의 수조를 깊이가 가장 낮은 두 갈래 나무로 바꾸다문제 정의: Givena sorted(increasing order) array, write an algorithm to create abinary tree with minimal height. 생각: 이 문제는 비...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.