poj3020——Antenna Placement

本文深入探讨了一种高效的算法解决方案,用于解决点阵中元素的不区分方向匹配问题。通过减半匹配计数并进行特定计算,最终得出匹配数量。算法详细步骤包括初始化数据结构、构建图模型、进行深度优先搜索,以及计算最终匹配数量。此外,代码实例展示了如何在实际应用中实现这一算法,提供了解决类似问题的实用工具。

这道题,不分左右的x,y点,直接匹配。将最终的匹配数ans除以2即可。而答案的话,应该是result=cnt(总的点数)-2*(ans/2)+ans/2。

#include<iostream> #include<string> #include<cstdio> using namespace std; #define H 45 #define maxn 450 string date[H]; int dir[][2]={{-1,0},{1,0},{0,-1},{0,1}}; int map[H][H]; int h,w; class node { public: int to; int next; }; node g[maxn*100]; int head[maxn],cnt,len; bool vis[maxn]; int my[maxn]; bool dfs(int v) { int i; for(i=head[v];i;i=g[i].next ) { int u=g[i].to ; if(vis[u]) { vis[u]=false ; if(my[u]==-1||dfs(my[u])) { my[u]=v;return true; } } } return false; } void solve() { int i,j,ans=0; for(i=1;i<=cnt;i++) my[i]=-1; for(i=1;i<=cnt;i++) { memset(vis,true,sizeof(vis)); if(dfs(i)) ans++; } ans/=2; int result=cnt-ans; cout<<result<<endl; } int main() { int t,i,j; cin>>t; while(t--) { cin>>h>>w; memset(head,0,sizeof(head)); for(i=0;i<h;i++) cin>>date[i]; cnt=0; for(i=0;i<h;i++) { for(j=0;j<w;j++) if(date[i].at (j)=='*') map[i][j]=++cnt; } len=0; for(i=0;i<h;i++) for(j=0;j<w;j++) if(date[i].at (j)=='*') { for(int k=0;k<4;k++) { int tempx=i+dir[k][0]; int tempy=j+dir[k][1]; if(tempx>=0&&tempx<h&&tempy>=0&&tempy<w&&date[tempx].at (tempy)=='*') { g[++len].to =map[tempx][tempy]; g[len].next =head[map[i][j]]; head[map[i][j]]=len; } } } solve(); } return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值