この質問の冒頭で、各ポイントに植えられたピーナッツの数が異なることはわかりませんでした。そこで、dfsを検討したところ、質問のピーナッツの数が異なることがわかりました。。。。。。。。直接並べ替えることができます
が、dfsがo(n!)に固執する可能性がありますが、この質問は固執していません。
質問の意味:選択するピーナッツの最大数を見つけるたびに、すべてに注意を払ってください行く時間グリッドと要約は2単位の時間なので、時間に注意してください
。dfsのアイデア:すべてのMAXを見つけて、すべての状況を検索します。dfsが入るたびに、このポイントに到達できることを示します。戻るまでの残り時間です;
ACコード:
#include<bits/stdc++.h>
using namespace std;
struct Node{
int x,y;
int val;
Node(int xx,int yy,int v){
x=xx;y=yy;val=v;
}
};
vector<Node> V;
int m,n,k;
int ans=0;
int book[30][30];//标记数组
void dfs(int xx,int yy,int t,int sum){
int MM=0;
for(int i=0;i<V.size();i++){
//找最大值出来
if(!book[V[i].y][V[i].x]){
if(V[i].val>MM){
MM=V[i].val;
}
}
}
int index[40];
int cnt=0;
for(int i=0;i<V.size();i++){
if(V[i].val==MM&&!book[V[i].y][V[i].x]){
//找出所有最大的值点
index[cnt++]=i;
}
}
for(int i=0;i<cnt;i++){
int x=V[index[i]].x,y=V[index[i]].y;
if(k-t-(abs(y-yy)+abs(x-xx)+1)>=y+1){
book[y][x]=1;
dfs(x,y,t+abs(y-yy)+abs(x-xx)+1,sum+V[index[i]].val);
book[y][x]=0;
}
}
//能执行到这里说明不能走了
ans=max(ans,sum);//取结果最大值
}
int main(){
scanf("%d %d %d",&m,&n,&k);
int Map[20][20];
int x[25],y[25];
int Max=0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
scanf("%d",&Map[i][j]);
Max=max(Map[i][j],Max);
if(Map[i][j])V.push_back(Node(j,i,Map[i][j]));
}
}
int num=0;
for(int i=0;i<V.size();i++){
if(V[i].val==Max){
x[num]=V[i].x;
y[num++]=V[i].y;
}
}
for(int i=0;i<num;i++){
if(k-y[i]-2>=y[i]+1)//下一个点可以走,并且有足够的时间回去
{
book[y[i]][x[i]]=1;
int sum=Map[y[i]][x[i]];
dfs(x[i],y[i],y[i]+2,sum);
book[y[i]][x[i]]=0;
}
}
printf("%d\n",ans);
return 0;
}