【HDU】5254 棋盘占领(BFS)
2015-06-04 00:25
302 查看
这题给的不明不白的,一开始不清楚有公共点是几个意思
10 11
01 可以变成 11
直接BFS就可以了
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 3 const 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; }
相关文章推荐
- WorldWind源码剖析系列:缓冲类Cache
- C/C++语言统计文件中单词出现个数
- vmware里面的linux怎么和windows相互传文件
- 正规表示法与文件格式化处理
- Oracle之SQL基础
- WorldWind源码剖析系列:绘制参数类DrawArgs
- 广商博客冲刺第六七天new
- 4.20
- [hdu4498]离散化,simpson求积分
- java简单的判断奇偶数方法(i & 1) != 0 i为奇数
- 团队管理的感悟---尽可能不要让成员感到怀才不遇
- List subList()
- hdu 1016 Prime Ring Problem(素数环,超时)
- 西普学院Crypto之用户名和密码
- 广商博客冲刺第四五天new
- WorldWind源码剖析系列:设置类SettingsBase
- Codeforces Round #249 (Div. 2) B. Pasha Maximizes(模拟)
- qemu-kvm编译错误
- [RHEL7.1]重新封装系统(制作模板)
- Algorithms—70.Climbing Stairs