ZOJ 2922 Bombs(類似BFS的陣列遍歷)
阿新 • • 發佈:2018-11-01
【連結】http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1921
【題意】給一個圖,圖中數值為炸彈的威力k(為0則該格沒有炸彈),每個炸彈爆炸會引爆其【左側k個格子】和【上方全部格子】,問最少手動引爆幾個炸彈能使所有炸彈都炸
【思路】
一個炸彈只能引爆其左側和上側,那麼下方和右方沒有炸彈的炸彈必然需要手動引爆
這個遍歷的過程就是從逆序掃,從最右下角依次從右到左從下到上的順序引爆
每引爆一個,呼叫函式完成剩下的連鎖反應。
設定三個簡單的函式:explore(),explore_left(),explore_up()
其中explore()呼叫explore_left()和explore_up()
explore_left()和explore_up()又分別呼叫了explore()
……總之忍著沒搜題解直接就這麼做了,對bfs有抗拒感,還是自己模擬了一下引爆過程比較符合正常人思維【誤
【程式碼】
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <string> #include <math.h> #include <iostream> #include <map> #include <vector> #include <set> #include <queue> #include <stack> #include <algorithm> using namespace std; #define MAX_LEN 1005 #define ll long long #define mod 100000007 #define MEM(a,al) memset(a,al,sizeof(a)) #define sfx(x) scanf("%lf",&x) #define sfxy(x,y) scanf("%lf%lf",&x,&y) #define sdx(x) scanf("%d",&x) #define sdxy(x,y) scanf("%d%d",&x,&y) #define pfx(x) printf("%.0f\n",x) #define pfxy(x,y) printf("%.6f %.6f\n",x,y) #define pdx(x) printf("%d\n",x) #define pdxy(x,y) printf("%d %d\n",x,y) #define getArray(a,len) for(int ia = 0; ia < len; ia++) scanf("%d",&a[ia]) #define printArray(a,len) for(int ia = 0; ia < len; ia++) printf("%d%c",a[ia],(ia==len-1)?'\n':' ') #define fora(i,n) for(i = 0; i < n; i++) #define fora1(i,n) for(i = 1; i <= n; i++) #define foraf(i,n) for(int i = 0; i < n; i++) #define foraf1(i,n) for(int i = 1; i <= n; i++) #define ford(i,n) for(i = n-1; i >= 0; i--) #define ford1(i,n) for(i = n; i > 0; i--) #define fordf(i,n) for(int i = n-1; i >= 0; i--) #define fordf1(i,n) for(int i = n; i > 0; i--) class WriteInfo{ public: void info() { printf("[Info] "); } void infoEnd() { printf(" [/Info]\n"); } } W; const int INF = 1<<29; const double INFD = 1e20; const double eps = 1e-6; int n,m; int a[MAX_LEN][MAX_LEN], g[MAX_LEN][MAX_LEN]; int total, co; void explode_left(int i, int jj){ void explode(int i, int j); for(int j = jj-1; j >= max(jj-a[i][jj], 0); j--){ if (co >= total) return; explode(i,j); } } void explode_up(int ii, int j){ void explode(int i, int j); for(int i = ii-1; i >= 0; i--){ if (co >= total) return; explode(i,j); } } void explode(int i, int j){ if (!g[i][j]) return; co++; if (co >= total) return; g[i][j] = 0; explode_left(i,j); explode_up(i,j); } int main() { int i,j,k; int T; while(~sdxy(n,m)){ fora(i,n) fora(j,m){ sdx(a[i][j]); g[i][j] = a[i][j] > 0 ? 1 : 0; total += g[i][j]; } co = 0; int res = 0; ford(i,n) ford(j,m){ // 手動引爆 if (g[i][j]){ res++; explode(i,j); } } pdx(res); } return 0; }