如果将棋盘变为n×m的,并且会告诉你每个位置的状态(1为有障碍),其余不变
输入
2 3
0 1 0
0 1 0
输出
2
code
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
int s,t;
int mp[201][201];
int dx[11]={1,1,2,2,-1,-1,-2,-2};
int dy[11]={-2,2,-1,1,-2,2,-1,1};
struct node
{
int v,w;
int id;
};
vector<node> p[41010];
int dep[41010];
int b[41010];
int c;
const int inf=1e15;
void add(int u,int v)
{
int c=p[u].size();
int cc=p[v].size();
p[u].push_back({v,1,cc});
p[v].push_back({u,0,c});
}
bool bfs()
{
memset(dep,-1,sizeof(dep));
dep[s]=0;
queue<int> q;
q.push(s);
while(!q.empty())
{
int x=q.front(); q.pop();
for(node xx:p[x])
{
int v=xx.v;
int w=xx.w;
if(dep[v]==-1&&w)
{
dep[v]=dep[x]+1;
q.push(v);
}
}
}
memset(b,0,sizeof(b));
return (dep[t]!=-1);
}
int dfs(int x,int y)
{
if(x==t) return y;
int siz=p[x].size();
for(int i=b[x];i<siz;i++)
{
b[x]=i;
node xx=p[x][i];
int v=xx.v;
int w=xx.w;
int id=xx.id;
if(dep[v]==dep[x]+1&&w)
{
int q=dfs(v,min(w,y));
if(q)
{
p[x][i].w-=q;
p[v][id].w+=q;
return q;
}
else dep[v]=-1;
}
}
return 0;
}
int dinic()
{
int ret=0;
while(bfs());
{
int q=dfs(s,inf);
while(q)
{
ret+=q;
q=dfs(s,inf);
}
}
return ret;
}
signed main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>mp[i][j];
if(mp[i][j])
{
c++;
}
}
}
s=n*m+1,t=n*m+2;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(mp[i][j])continue;
int now=(i-1)*n+j;
if((i+j)&1)
{
add(s,now);
for(int k=0;k<=7;k++)
{
int xx=i+dx[i];
int yy=j+dy[i];
if(xx<1||yy<1||xx>n||yy>m||mp[xx][yy]) continue;
add(now,(xx-1)*n+yy);
}
}
else add(now,t);
}
}
cout<<n*m-c-dinic();
return 0;
}
死循环了,怀疑使建图错了
求条或给出其他思路
急!!!