uva1603 破壞正方形

書上已經(jīng)講得很清楚了 主要是拿什么數(shù)據(jù)結(jié)構(gòu)表示的問題
這道題跟萬圣節(jié)移動(dòng)幾個(gè)小鬼的問題i一樣要處理一下
就是要用一個(gè)二維數(shù)組表示 array [num ] [stick] 第num個(gè)東西有stick的成分
比如G[num][dir]表示num個(gè)格子上有dir的移動(dòng)方式
這題是contains[num][side] = 1表示第num個(gè)正方形有第side的棒子
然后就是算法了 有這個(gè)數(shù)組自然會(huì)去表示現(xiàn)在這個(gè)狀態(tài)第num個(gè)方形上有幾個(gè)棍子(或者說他是不是方形)也就是size[num] = sticks 第num方形有sticks火柴
有這幾個(gè)東西自然就知道要先做預(yù)處理 枚舉一下方形的坐標(biāo)統(tǒng)計(jì)
然后是暴力的搜索 每次選最小的方形選擇一個(gè)火柴去破壞 前面已經(jīng)講了這個(gè)火柴怎么表達(dá)了 然后搜索就行
我自己合上書寫的時(shí)候犯了兩個(gè)小錯(cuò) 一直tle 查了一段時(shí)間
首先 剪枝 找到一個(gè)答案就可以設(shè)為最佳 比這個(gè)答案層數(shù)更多的就不要dfs了
還有就是預(yù)處理的時(shí)候順序有點(diǎn)問題 print出來就好了

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int maxs = 60;
const int maxm = 60;
int ans;
int square, n, k;                                             //square拆解之前所有可能的正方形數(shù)目 
int contains[maxs][maxm], size[maxs], fullsize[maxs];         //contain[ num ][ stick] 第num個(gè)正方形有編號(hào)為第stick根的棒子組成 
int stick[maxm];


void init(){
    scanf("%d%d", &n, &k);
    for(int i = 1; i <= 2*n*(n+1); i++) stick[i] = 1;                    //初始化順序 
    while(k--){
        int v;
        scanf("%d", &v);
        stick[v] = 0;
    }
//printf("test\n");
//for(int i = 1; i < 2*n*(n+1); i++) printf("%d ", stick[i]);
//printf("%d\n", stick[2*n*(n+1)]);
    square = 0;
    memset(contains, 0, sizeof(contains));
    for(int len = 1; len <= n; len++){
        for(int x = 0; x <= n-len; x++){
            for(int y = 0; y <= n-len; y++){
                size[square] = 0;
                fullsize[square] = 4*len;
                for(int j = 1; j <= len; j++){
                    int up = (2*n+1)*y+x+j;
                    int down = (2*n+1)*(y+len)+x+j;
                    int left = (2*n+1)*(y+j)+x-n;
                    int right = (2*n+1)*(y+j)+x+len-n;
                    contains[square][up] = 1;
                    contains[square][down] = 1;
                    contains[square][left] = 1;
                    contains[square][right] = 1;
//                  if(len == 2){
//                      printf("x %d y %d j %d",x,y,j);
//                      printf(" up %d  down %d left %d right %d\n",up,down,left,right);
//                  }
                    size[square] += stick[up] + stick[down] + stick[left] + stick[right];
                }
                square++;
            }
        }
    }
//for(int i = 0; i < square; i++){
//  if(size[i] == fullsize[i]){
//      printf("%d\n",i);
//          for(int j = 1; j <= 2*n*(n+1); j++){
//              printf("%d ", contains[i][j]);
//          }
//      printf("\n");       
//  }
//}
//for(int i = 0; i < square; i++){
//  printf("%d ",size[i]);
//}
}
int count(){
    for(int s = 0; s < square; s++){
        if(size[s] == fullsize[s]) return s;
    }
    return -1;
}
void dfs(int dep){
    if(dep>ans) return;            //剪枝 
    
    int flag = count();
    if(flag == -1){
        ans = min(dep, ans);
        return;
    }//else{
        for(int s = 1; s <= 2*n*(n+1); s++){
            if(contains[flag][s]){
                for(int i = 0; i < square; i++){
                    if(contains[i][s]) size[i]--;
                }
                dfs(dep+1);
                for(int i = 0; i < square; i++){
                    if(contains[i][s]) size[i]++;
                }
            }
        }
//  }
}

int main(){
    int T;
    scanf("%d", &T);
    while(T--){
        init();
        ans = n*n;
        dfs(0);
        printf("%d\n",ans);
    }
    return 0;
} 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評(píng)論 19 139
  • js簡介 Js是一種基于事件和對(duì)象驅(qū)動(dòng)的解釋性、松散性的語言。 一切皆對(duì)象 javascript 布蘭登艾奇 ...
    塔庫納瑪哈哈閱讀 1,346評(píng)論 0 2
  • 壺生 2017.4 若無緣 為何展笑顏 六道間 菩提眾生繁 惟獨(dú)與汝相見 冥冥連 三千...
    村夫_352d閱讀 522評(píng)論 1 5
  • 分手兩年多來,想你想的不行了的時(shí)候會(huì)去你單位、家附近等,盼望著能看你一眼,走在街上,尤其是你經(jīng)?;顒?dòng)的地方...
    崔小瓊閱讀 312評(píng)論 0 0
  • 第二次開始我掙錢的小生意是在初中了,那時(shí)候跟著爸媽剛到新疆沒幾年,因?yàn)榻?jīng)驗(yàn)不足,在兵團(tuán)兄弟虧損了,我上學(xué)時(shí)的錢都是...
    外婆家素顏閱讀 240評(píng)論 0 0

友情鏈接更多精彩內(nèi)容