這題我之前寫沒想到迭代加深,看了題解,然後學習了這種搜尋(之前我寫的某題也用過,,但是不懂專業名詞 囧。)
迭代加深搜尋就是限制搜尋深度,一旦有可行解立即跳出,優化了深搜一直搜下去的毛病。
(囧,這題搜尋題寫了我一下午,我搜尋的確很弱啊!!!)
第一次寫出來的版本我沒有注意到,應該是從多個點拓展下去,而不是從某個點。
第二次寫出來的版本的確從所有可行點拓展下去,但是樣例都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的棋盤,上面有一些格仔被染成了黑色,其他的格仔都是白色,你的任務的對棋盤一些格仔進行染色,使得所有的黑色格仔能連成一塊,並且你染色的格仔數目要最少。讀入乙個初始棋盤的狀態,輸出最少需要對多少個格仔進行染色,才能使得所...