解法
BFS。左上から見ていって、滴数 < 0か垂らしても残った時に枝刈りした。
これでVolume0全完。
ソース
#include<bits/stdc++.h>
using namespace std;
int q, mas[10][10];
int draw[][5][5] = {
/*Small*/
{{ 0, 0, 1, 0, 0},
{ 0, 1, 1, 1, 0},
{ 0, 0, 1, 0, 0}},
//*midium*/
{{ 0, 0, 1, 1, 1},
{ 0, 0, 1, 1, 1},
{ 0, 0, 1, 1, 1}},
/*large*/
{{ 0, 0, 1, 0, 0},
{ 0, 1, 1, 1, 0},
{ 1, 1, 1, 1, 1},
{ 0, 1, 1, 1, 0},
{ 0, 0, 1, 0, 0}},
};
bool check( int y, int x, int w){
for(int i = 0 ; i < 5 ; i++ ){
for(int j = 0 ; j < 5 ; j++ ){
if(mas[y + i][x + j - 2] - draw[w][i][j] < 0) return false;
}
}
return true;
}
void paint( int y, int x, int w){
for(int i = 0 ; i < 5 ; i++ ){
for(int j = 0 ; j < 5 ; j++ ){
mas[y + i][x + j - 2] -= draw[w][i][j];
}
}
}
void repaint( int y, int x, int w){
for(int i = 0 ; i < 5 ; i++ ){
for(int j = 0 ; j < 5 ; j++ ){
mas[y + i][x + j - 2] += draw[w][i][j];
}
}
}
bool rec( int y, int x, int n){
if( n < 0 ) return false;
if( y == 10 ) return n == 0;
if( mas[y][x] == 0 ) return rec( y + (x == 9), (x + 1) % 10, n);
for(int i = 0 ; i < 3 ; i++ ){
if(!check( y, x, i)) continue;
paint( y, x, i);
if(rec( y, x, n - 1)){
cout << x + (i == 1) << " " << y + 1 + (i == 2) << " " << i + 1 << endl;
return true;
}
repaint( y, x, i);
}
return false;
}
int main(){
cin >> q;
for(int i = 0 ; i < 10 ; i++ ){
for(int j = 0 ; j < 10 ; j++ ){
cin >> mas[i][j];
}
}
rec( 0, 0, q);
}
0 件のコメント:
コメントを投稿