poj-1856 Sea Battle
来源:互联网 发布:八爪鱼头部按摩器 知乎 编辑:程序博客网 时间:2024/05/13 15:06
http://poj.org/problem?id=1856
题目大意:合法船只的定义:由#构成的矩形,被一圈“.”所围成的船就是合法船只。如果有不合法的船只输出Bad placement.,否则输出合法船只的个数。
队内赛题,当时题没有读懂还是别人告诉我的,亏数据太水不然比赛时就爆0了。
附上复杂代码:找矩形,然后在判断是否满足条件(比赛时还是不要太紧张为好,思维不求快,求精密)
/*****6 6.....###...###...#..#..#.....#######6 8.....#.###.....###.....#.......##......##..#...#0 05 5##.....###.....##........5 5##.##..#....#..#...#....#5 5###..####.###.......#....Bad placement.5 5##..###..#...#......##...5 5##.####.####......####...Bad placement.There are 5 ships.******/#include <iostream>#include<stdio.h>#include<string.h>using namespace std;int n,m;char S[1005][1005];int G[1005][1005];int B;void dfs(int a,int b){ if(G[a-1][b]||G[a+1][b-1]||G[a+1][b+1]||G[a-1][b+1]||G[a-1][b-1]) B=0; int q=0; for(int r=b; r<m; r++) { if(S[a][r]!='#') break; if(G[a-1][r]||G[a+1][r-1]||G[a+1][r+1]||G[a-1][r+1]||G[a-1][r-1]) B=0; if(G[a][r]) break; q++; //cout<<r<<"->"<<endl; } //cout<<a<<" "<<b<<endl; //cout<<B<<"---"<<endl; for(int r=a; r<n; r++) { int sum=0,t; if(S[r][b]!='#') break; for( t=b; t<m; t++) { if(S[r][t]!='#') break; if(G[r][t]) { B=0; continue; } if(S[r][t]=='#') { G[r][t]=1; sum++; } } if(sum!=q) B=0; }}int main(){ while(cin>>n>>m&&n!=0&&m!=0) { memset(G,0,sizeof(G)); cin.get(); for(int i=0; i<n; i++) gets(S[i]); int sum=0; B=1; for(int i=0; i<n; i++) { if(!B) break; for(int j=0; j<m; j++) { if(!B) break; if(!G[i][j]&&S[i][j]=='#') { sum++; dfs(i,j); } } } if(B) cout<<"There are "<<sum<<" ships."<<endl; else cout<<"Bad placement."<<endl; } return 0;}
大神的神算法:http://blog.csdn.net/mengxiang000000/article/details/51493408
#include <iostream>#include<stdio.h>#include<string>#include<cstring>#include<algorithm>#include<cmath>#define N 1010int maxx,maxy,minx,miny;using namespace std;char map[N][N];int r,c;bool check(int x,int y){ if(x>=0&&x<r&&y>=0&&y<c&&map[x][y]=='#') return true; return false;}int dfs(int x,int y){ minx=min(minx,x); maxx=max(maxx,x); miny=min(miny,y); maxy=max(maxy,y); map[x][y]='.'; int rec=1; for(int i=-1;i<=1;i++) for(int j=-1;j<=1;j++) { if(check(i+x,j+y)) { rec+=dfs(i+x,j+y); } } return rec;}int main(){ while(~scanf("%d%d",&r,&c)) { if(r==0&&c==0) break; for(int i=0;i<r;i++) scanf("%s",map[i]); int ans=0; for(int i=0;i<r;i++) for(int j=0;j<c;j++) { if(map[i][j]=='#') { maxx=minx=i; maxy=miny=j; int rec=dfs(i,j); if(rec==(maxx-minx+1)*(maxy-miny+1)) ans++; else { ans=-1;//只要有一艘坏船就是bad i=r; break; } } } if(ans==-1) printf("Bad placement.\n"); else printf("There are %d ships.\n",ans); } return 0;}
0 0
- POJ 1856 Sea Battle
- poj-1856 Sea Battle
- POJ 1856 Sea Battle(DFS)
- POJ 1856 Sea Battle(BFS).
- POJ 1856 Sea Battle(DFS)
- POJ 1856 Sea Battle 笔记
- POJ 1856 Sea Battle(dfs)
- Poj 1856 Sea Battle【Dfs+思维】
- poj 1856Sea Battle(BFS ,DFS亦可)
- POJ 3546 Sea battle 英文少
- Codeforces738D-Sea Battle(贪心)
- codeforces 738D Sea Battle 思维+构造
- 【Codeforces 729D Sea Battle】+ 简单思维
- Codeforces(738D)-D. Sea Battle
- cf 729D Sea Battle 【模拟,贪心】
- Codeforces Round #380 (Div. 2) D. Sea Battle
- Technocup 2017 - Elimination Round 2 D. Sea Battle
- Codeforces Round #380 D. Sea Battle (思维题)
- Codevs 2980 买帽子
- 【网络】【牛客】关于网络的一些问题
- poj3046
- Linux下Sublime Text 2 中文输入
- PHP 伪静态规则写法RewriteRule-htaccess详细语法使用
- poj-1856 Sea Battle
- 常见的面试题总结(2016)
- CSS3绘制四个角不同半径的圆角边框
- 【数据结构与算法分析】《算法竞赛入门经典》第一章 示例及答案
- request.getParameter() 和request.getAttribute() 区别
- Oracle数据库如何打补丁
- 数据库SQL优化大总结之 百万级数据库优化方案
- 二叉搜索树的后序遍历序列
- SSH框架总结