为什么下面一组样例标准答案是0?
样例:
4 8
79 64 38 84
73 36 10 39
48 45 97 24
92 25 46 44
27 37 9 9
52 35 3 83
33 94 71 39
63 95 24 97
但是找到一条路径(坐标x,y,左上角数字为0,0):
1 1
2 1
3 1
3 2
4 2
4 1
5 1
6 1
7 1
8 1
8 2
7 2
6 2
5 2
5 3
#include<iostream>
#include<cstring>
using namespace std;
int m,n;
int a[15][15];
int st[15][15],st2[15][15];
int goal;
int ans=110;
pair<int,int> tmp[110];int p;//
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
void dfs2(int x,int y){
st2[x][y]=true;
for(int i=0;i<4;i++){
int tx=x+dx[i],ty=y+dy[i];
if(tx<1||tx>n||ty<1||ty>m)continue;
if(st2[tx][ty])continue;
dfs2(tx,ty);
}
return;
}
void dfs(int x,int y,int cnt,int sum){
//cout<<x<<" "<<y<<endl;
tmp[p++]={x,y};//
st[x][y]=true;
sum+=a[x][y];
cnt++;
if(sum>goal){
//cout<<"over max"<<endl;//
cnt--;
sum-=a[x][y];
st[x][y]=false;p--;//
return;
}
else if(sum==goal){
//cout<<"### consider update ###"<<cnt<<endl;//
//for(int i=0;i<p;i++)cout<<tmp[i].first<<" "<<tmp[i].second<<endl;//
//cout<<"### show end ###"<<endl;//
memcpy(st2,st,sizeof st2);
/*cout<<"st:"<<endl;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<st[i][j]<<" ";
}
cout<<endl;
}*/
bool flag=false;
for(int i=1;i<=n && flag==false;i++){
for(int j=1;j<=m;j++){
if(st[i][j]==false){
//cout<<"search "<<i<<" "<<j<<endl;//
dfs2(i,j);
flag=true;
break;
}
}
}
/*cout<<"st2:"<<endl;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<st2[i][j]<<" ";
}
cout<<endl;
}*/
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(st[i][j]==false&&st2[i][j]==false){//都没访问过
cnt--;
sum-=a[x][y];
st[x][y]=false;p--;//
//cout<<"consider wrong"<<endl;//
return;
}
}
}
//cout<<"pass test"<<endl;//
//cout<<"current sum: "<<sum<<endl;//
//cout<<"### update result### "<<cnt<<endl;//
//for(int i=0;i<p;i++)cout<<tmp[i].first<<" "<<tmp[i].second<<endl;//
//cout<<"### show end ###"<<endl;//
ans=min(ans,cnt);
cnt--;
sum-=a[x][y];
st[x][y]=false;p--;//
return;
}
for(int i=0;i<4;i++){
int tx=x+dx[i],ty=y+dy[i];
if(tx<1||tx>n||ty<1||ty>m)continue;
if(st[tx][ty])continue;
dfs(tx,ty,cnt,sum);
}
cnt--;
sum-=a[x][y];
st[x][y]=false;p--;//
return;
}
int main(){
cin>>m>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
goal+=a[i][j];
}
}
goal/=2;
//cout<<goal<<endl;
//cout<<endl;
bool find=false;
dfs(1,1,0,0);
if(ans!=110)cout<<ans<<endl;
else cout<<"0"<<endl;
return 0;
}
这套数据的和为1615 肯定分不了一半 直接返回无解 至于为什么会找到解 我猜大概率找到了 和为 1615 / 2 = 807 这个解
你的坐标应该是左上角那个数字为(1, 1)吧,不然下面的坐标为什么有(8, 1)