【HDU】5254 棋盘占领(BFS)

来源:互联网 发布:作业管理系统java 编辑:程序博客网 时间:2024/05/21 11:33

这题给的不明不白的,一开始不清楚有公共点是几个意思

10 11

01   可以变成 11

直接BFS就可以了

#include<queue>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 555;int n,m,ans;int vis[maxn][maxn];int mat[maxn][maxn];int state[maxn][maxn][4];// 0 1 2 3const int dir[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};queue<int>qx,qy;bool judge(int x,int y){    if(state[x][y][0] && state[x][y][2]) return true;    if(state[x][y][0] && state[x][y][3]) return true;    if(state[x][y][1] && state[x][y][2]) return true;    if(state[x][y][1] && state[x][y][3]) return true;    return false;}void bfs(){    while(!qx.empty()){        int x = qx.front(),y = qy.front();        qx.pop(); qy.pop();        for(int i = 0; i < 4; i++){            int xx = x + dir[i][0];            int yy = y + dir[i][1];            if(xx >=  1 && xx <= n && yy >= 1 && yy <= m && !vis[xx][yy]){                state[xx][yy][i] = 1;                if(judge(xx,yy)){                    vis[xx][yy] = 1;                    qx.push(xx); qy.push(yy);                    ans ++;                }            }        }    }    printf("%d\n",ans);}int main(){    int T,Case = 1;    scanf("%d",&T);    while(T--){        int t;        memset(vis,0,sizeof(vis));        memset(state,0,sizeof(state));        scanf("%d%d",&n,&m);        scanf("%d",&t);        ans = 0;        for(int i = 0; i < t; i++){            int x,y;            scanf("%d%d",&x,&y);            if(!vis[x][y]){                vis[x][y] = 1;                qx.push(x); qy.push(y);                ans ++;            }        }        printf("Case #%d:\n",Case++);        bfs();    }    return 0;}


0 0
原创粉丝点击