90分,第16,18个点错了,找了几天了,没找出来,求找原因
查看原帖
90分,第16,18个点错了,找了几天了,没找出来,求找原因
54656
churao001楼主2020/4/30 14:57
#include<bits/stdc++.h>
using namespace std;
int n,m,c1,c2,dd,i,j,bj[352][352],sx,sy,zx,zy,w,x,y,u,v,xx,yy,k,a[352][352],b[352][352];
int ans[352][352][17][17],ansmin=1.5e9,ansu,ansv;
int c[12]={0,1,-1,0,0,1,1,-1,-1};
int d[12]={0,0,0,1,-1,1,-1,1,-1};
vector<int>t[352];
char ch;
queue<int>q;
int main()
{
//	freopen("3.in","r",stdin);
	cin>>n>>m>>c1>>c2>>dd; 
	for(i=1;i<=n;i++)
	  for(j=1;j<=m;j++)
	    {ch=getchar();
	     while(ch!='S'&&ch!='T'&&ch!='.'&&(ch<48||ch>57))ch=getchar();
	     if(ch=='S')sx=i,sy=j;
	     else if(ch=='T')zx=i,zy=j;
	       else while(ch>=48&&ch<=57){a[i][j]=a[i][j]*10+ch-48;ch=getchar();} 
	     if(a[i][j])t[a[i][j]].push_back(i*1000+j);//记录a[i][j]值与所在的位置 
	    }
	for(i=350;i>=1;i--)//从大到小枚举 
	  for(j=0;j<t[i].size();j++)//千万不要写出j<=t[i].size()-1 
	    {x=t[i][j]/1000,y=t[i][j]%1000;//得出当前最大的a[][]值所在的位置 
	     if(bj[x][y]==0)//第一次使用该点 
	      {bj[x][y]=1;b[x][y]=i;//标记该点,记录关键点,判断是否被观察到
	       for(k=1;k<=4;k++)
	        {xx=x+c[k],yy=y+d[k];
	         if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&bj[xx][yy]==0)
	         t[i-1].push_back(xx*1000+yy);//把扩展后的符合要求的点加入到动态数组
	         } 
              }
             }
	q.push(0*100000000+0*1000000+sx*1000+sy);//起始点插入到队列中 
	memset(ans,63,sizeof(ans));ans[sx][sy][0][0]=0;  
while(q.size())
    {w=q.front();u=w/100000000%10;v=w/1000000%10;x=w/1000%1000;y=w%1000;q.pop();
//		if(x==zx&&y==zy)cout<<ans[x][y][u][v]<<" ";
     if(x==zx&&y==zy&&(ans[x][y][u][v]<ansmin||(ans[x][y][u] [v]==ansmin&&u+v<ansu+ansv)||(ans[x][y][u][v]==ansmin&&u+v==ansu+ansv&&u<ansu))){ansmin=ans[x][y][u][v];ansu=u;ansv=v;}//更新答案 
     if(ans[x][y][u][v]<ansmin)//答案优化,
     {for(i=1;i<=8;i++)//直接走
         {xx=x+c[i],yy=y+d[i];//b[][]==0表示该点卫兵探测不到,不需要隐身,
         if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&a[xx][yy]==0&&b[xx][yy]==0&&ans[xx][yy][u][v]>ans[x][y][u][v]+1)
       {q.push(u*100000000+v*1000000+xx*1000+yy);ans[xx][yy][u][v]=ans[x][y][u][v]+1;}
          }
if(u+1<=c1)//隐身 
for(int i=1;i<=8;i++)
{xx=x+c[i],yy=y+d[i];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&a[xx][yy]==0&&ans[xx][yy][u+1][v]>ans[x][y][u][v]+1)
 {q.push((u+1)*100000000+v*1000000+xx*1000+yy);ans[xx][yy][u+1][v]=ans[x][y][u][v]+1;}
}
if(v+1<=c2)//瞬移 
for(int i=1;i<=4;i++)
{xx=x+c[i]*dd,yy=y+d[i]*dd;
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&a[xx][yy]==0&&b[xx][yy]==0&&ans[xx][yy][u][v+1]>ans[x][y][u][v]+1)
{q.push(u*100000000+(v+1)*1000000+xx*1000+yy);ans[xx][yy][u][v+1]=ans[x][y][u][v]+1;}
}
if(u+1<=c1&&v+1<=c2)//瞬移+隐身
for(int i=1;i<=4;i++) 
{xx=x+c[i]*dd,yy=y+d[i]*dd;
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&a[xx][yy]==0&&ans[xx][yy][u+1][v+1]>ans[x][y][u][v]+1)
{q.push((u+1)*100000000+(v+1)*1000000+xx*1000+yy);ans[xx][yy][u+1][v+1]=ans[x][y][u][v]+1;}
}
}
}
	if(ansmin>10000000)cout<<-1;
	else cout<<ansmin<<" "<<ansu<<" "<<ansv;
	return 0;
}

```格式太难调了.....后面把他全部顶格算了,抱歉
2020/4/30 14:57
加载中...