4808: 马
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 425 Solved: 149
[Submit][Status][Discuss]
Description
众所周知,马后炮是中国象棋中很厉害的一招必杀技。"马走日字"。本来,如果在要去的方向有别的棋子挡住(俗
称"蹩马腿"),则不允许走过去。为了简化问题,我们不考虑这一点。马跟马显然不能在一起打起来,于是rly在
一天再次借来了许多许多的马在棋盘上摆了起来……但这次,他实在没兴趣算方案数了,所以他只想知道在N×M的
矩形方格中摆马使其互不吃到的情况下的最多个数。但是,有一个很不幸的消息,rly由于玩得太Happy,质量本来
就不好的棋盘被rly弄坏了,不过幸好只是破了其中的一些格子(即不能再放子了),问题还是可以继续解决的。
Input
一行,两个正整数N和M。
接下来N行,每行M个数,要么为0,表示没坏,要么为1,表示坏了。
N<=200,M<=200
Output
一行,输出最多的个数。
Sample Input
2 3
0 1 0
0 1 0
0 1 0
0 1 0
Sample Output
2
HINT
Source
继续WA _(:зゝ∠)_
1 #include "bits/stdc++.h" 2 using namespace std; 3 typedef long long LL; 4 const int MAX=1005; 5 int n,m,a[MAX][MAX],id[MAX][MAX],b[MAX][MAX],tx,ans; 6 int fa[MAX*MAX]; 7 bool vis[MAX*MAX]; 8 int dx[8]={-2,-1,1,2,2,1,-1,-2}; 9 int dy[8]={1,2,2,1,-1,-2,-2,-1}; 10 int dfs(int x){ 11 int i,j; 12 for (i=1;i<=tx;i++) 13 if (!vis[i] && b[x][i]){ 14 vis[i]=true; 15 if (fa[i]==-1 || dfs(fa[i])) 16 return fa[i]=x,1; 17 } 18 return 0; 19 } 20 int main(){ 21 freopen ("horse.in","r",stdin);freopen ("horse.out","w",stdout); 22 int i,j,k,x,y; 23 scanf("%d%d",&n,&m); 24 for (i=1;i<=n;i++) 25 for (j=1;j<=m;j++) 26 scanf("%d",&a[i][j]),id[i][j]=a[i][j]==0?++tx:0; 27 for (i=1;i<=n;i++) 28 for (j=1;j<=m;j++) 29 if (!a[i][j]) 30 for (k=0;k<8;k++){ 31 x=i+dx[k],y=j+dy[k]; 32 if (x<1 || x>n || y<1 || y>m || a[x][y]) continue; 33 b[ id[i][j] ][ id[x][y] ]=1; 34 } 35 memset(fa,-1,sizeof(fa)); 36 int zt=0; 37 for (i=1;i<=tx;i++){ 38 memset(vis,false,sizeof(vis)); 39 zt+=dfs(i); 40 } 41 printf("%d",tx-zt/2); 42 return 0; 43 }
未来是什么样,未来会发生什么,谁也不知道。
但是我知道,
起码从今天开始努力,
肯定比从明天开始努力,
要快一天实现梦想。
千里之行,始于足下! ——《那年那兔那些事儿》