wikioi 1049 棋盤染色(迭代深搜)

2021-09-06 17:26:31 字數 1937 閱讀 3806

這題我之前寫沒想到迭代加深,看了題解,然後學習了這種搜尋(之前我寫的某題也用過,,但是不懂專業名詞 囧。)

迭代加深搜尋就是限制搜尋深度,一旦有可行解立即跳出,優化了深搜一直搜下去的毛病。

(囧,這題搜尋題寫了我一下午,我搜尋的確很弱啊!!!)

第一次寫出來的版本我沒有注意到,應該是從多個點拓展下去,而不是從某個點。

第二次寫出來的版本的確從所有可行點拓展下去,但是樣例都tle。。

第三次看了別人的標程發現直接向右和向拓展就行了囧0.0一行一行的拓展,而不用向上拓展了(因為已經拓展過 啊囧)

果然我是蒟蒻。。

#include #include #include #include #include #include using namespace std;

#define rep(i, n) for(int i=0; i

#define for1(i,a,n) for(int i=(a);i<=(n);++i)

#define for2(i,a,n) for(int i=(a);i

#define for3(i,a,n) for(int i=(a);i>=(n);--i)

#define for4(i,a,n) for(int i=(a);i>(n);--i)

#define cc(i,a) memset(i,a,sizeof(i))

#define max(a,b) ((a)>(b)?(a):(b))

#define min(a,b) ((a)

#define read(a) a=getnum()

#define print(a) printf("%d", a)

inline int getnum()

int m[7][7], vis[7][7], vis2[7][7];

const int fx[4]=, fy[4]=;

int s, flag;

void dfs2(int x, int y)

}bool check()

if(f) break;

} if(!nx && !ny) return false;

cc(vis, 0);

dfs2(nx, ny);

for1(i, 1, 5) for1(j, 1, 5) if(m[i][j] && !vis[i][j]) return false;

return true;

}void dfs(int x, int y, int k) */if(check()) flag=1; return; }

if(flag||x==6) return;

for1(i, y, 5) if(!m[x][i])

for1(i, x+1, 5) for1(j, 1, 5) if(!m[i][j])

}int main()

for1(i, 1, 25)

} print(ans);

return 0;

}

有乙個5×5的 棋盤,上面有一些格仔被染成了黑色,其他的格仔都是白色,你的任務的對棋盤一些格仔進行染色,使得所有的黑色格仔能連成一塊,並且你染色的格仔數目要最 少。讀入乙個初始棋盤的狀態,輸出最少需要對多少個格仔進行染色,才能使得所有的黑色格仔都連成一塊。(注:連線是指上下左右四個方向,如果兩個黑色格仔 只共有乙個點,那麼不算連線)

輸入包括乙個5×5的01矩陣,中間無空格,1表示格仔已經被染成黑色。

輸出最少需要對多少個格仔進行染色

1049 棋盤染色

時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解檢視執行結果 有乙個5 5的棋盤,上面有一些格仔被染成了黑色,其他的格仔都是白色,你的任務的對棋盤一些格仔進行染色,使得所有的黑色格仔能連成一塊,並且你染色的格仔數目要最少。讀入乙個初始棋盤的狀態,輸出最少需要對多少個格仔進行染...

Codevs 1049 棋盤染色

時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解有乙個5 5的棋盤,上面有一些格仔被染成了黑色,其他的格仔都是白色,你的任務的對棋盤一些格仔進行染色,使得所有的黑色格仔能連成一塊,並且你染色的格仔數目要最少。讀入乙個初始棋盤的狀態,輸出最少需要對多少個格仔進行染色,才能使得所...

Codevs 1049 棋盤染色

時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解有乙個5 5的棋盤,上面有一些格仔被染成了黑色,其他的格仔都是白色,你的任務的對棋盤一些格仔進行染色,使得所有的黑色格仔能連成一塊,並且你染色的格仔數目要最少。讀入乙個初始棋盤的狀態,輸出最少需要對多少個格仔進行染色,才能使得所...