1. 程式人生 > >Codevs 1049 棋盤染色

Codevs 1049 棋盤染色

ive clu script nbsp oid tro 一個 class lose

1049 棋盤染色

時間限制: 1 s 空間限制: 128000 KB 題目等級 : 黃金 Gold 題目描述 Description

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

輸入描述 Input Description

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

輸出描述 Output Description

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

樣例輸入 Sample Input

11100

11000

10000

01111

11111

樣例輸出 Sample Output

1

這題真JB蛋疼

技術分享
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int ans=0x7fffffff
; bool vis[10][10],color[10][10],now[10][10]; int e[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; bool V[10][10]; int cnt,fr,num; struct node{ int u,v; }point[30]; bool check(int nx,int ny){ V[nx][ny]=1;cnt++; for(int i=0;i<4;i++){ int x=nx+e[i][0],y=ny+e[i][1]; if(x<=5&&x>=1
&&y<=5&&y>=1){ if(now[x][y]&&!V[x][y]) check(x,y); } } } void dfs(int step){ if(step>ans)return; if(step>7)return; memset(V,0,sizeof(V)); cnt=0; int nx=0,ny=0;//找一個黑格子 for(int i=1;i<=5;i++){ for(int j=1;j<=5;j++) if(now[i][j]==1){ nx=i,ny=j; break; } if(nx&&ny)break; } check(nx,ny); if(cnt==step+fr)ans=min(ans,step); for(int i=1;i<=num;i++){ int x=point[i].u,y=point[i].v; if(!now[x][y]){ now[x][y]=1; dfs(step+1); now[x][y]=0; } } } char ch[10]; int main(){ for(int i=1;i<=5;i++){ scanf("%s",ch+1); for(int j=1;j<=5;j++){ color[i][j]=ch[j]-0; now[i][j]=color[i][j]; if(color[i][j])fr++; if(!color[i][j]){ point[++num].u=i; point[num].v=j; } } } dfs(0); printf("%d",ans); }
50分 爆搜 技術分享
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int map[10][10],copy[10][10],stan,First,cnt;
bool ans,vis[10][10];
char ch[10];
int e[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
void check(int x,int y){
    vis[x][y]=1;
    cnt++;
    for(int i=0;i<4;i++){
        int xx=x+e[i][0],yy=y+e[i][1];
        if(xx<=5&&xx>=1&&yy<=5&&yy>=1&&!vis[xx][yy]&&map[xx][yy])
            check(xx,yy);
    }
}
void dfs(int x,int y,int k){
    if(k==stan){
        int xx=0,yy=0,now=0;
        for(int i=1;i<=5;i++){
            for(int j=1;j<=5;j++){
                if(map[i][j]){
                    xx=i;yy=j;
                    now++;
                }
            }
        }
        cnt=0;
        memset(vis,0,sizeof(vis));
        check(xx,yy);
        if(cnt==now){
            ans=1;
            return;
        }
    }
    if(ans||x==6)return;
    for(int i=y;i<=5;i++){
        if(map[x][i])continue;
        map[x][i]=1;
        dfs(x,i,k+1);
        map[x][i]=0;
    }
    for(int i=x+1;i<=5;i++){
        for(int j=1;j<=5;j++){
            if(map[i][j])continue;
            map[i][j]=1;
            dfs(i,j,k+1);
            map[i][j]=0;
        }
    }
}
int main(){
    for(int i=1;i<=5;i++){
        scanf("%s",ch+1);
        for(int j=1;j<=5;j++){
            map[i][j]=ch[j]-0;
        }
    }
    for(stan=0;stan<=25;stan++){
        dfs(1,1,0);
        if(ans==1){
            printf("%d",stan);
            return 0;
        }
    }
}
100分 叠代加深搜索

Codevs 1049 棋盤染色