社区讨论
TLE了的记忆化DFS,70pts求助!
P3956[NOIP 2017 普及组] 棋盘参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lo3aof5x
- 此快照首次捕获于
- 2023/10/24 03:32 2 年前
- 此快照最后确认于
- 2023/10/24 03:32 2 年前
CPP
#include<iostream>
#include<cmath>
using namespace std;
int n,m,ans=99999999;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int map[105][105],g[105][105],t[105][105];
void dfs(int x,int y,int old,int p,int flag)
{
if(x<1||y<1||x>n||y>n)return ;
if(p>ans)return;//cout<<x<<' '<<y<<'\n';
if(!t[x][y])t[x][y]=p;
if(p>t[x][y])return;
t[x][y]=p;
if(x==n&&y==n){
if(p<ans)
ans=p;
return;
}
for(int i=0;i<4;i++)
{
int xx=x+dx[i];
int yy=y+dy[i];
if(!g[xx][yy])
{
int f=0,q=0;
if(map[xx][yy]==0&&flag==1)continue;
if(map[xx][yy]==0)f=1,q+=2;
else
if(map[xx][yy]!=old)q+=1;
g[xx][yy]=1;
if(f==1)
dfs(xx,yy,old,p+q,f);
else
dfs(xx,yy,map[xx][yy],p+q,f);
g[xx][yy]=0;
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int a,b,c;
cin>>a>>b>>c;
map[a][b]=c+1;
}
dfs(1,1,map[1][1],0,0);
if(ans==99999999)
cout<<-1;
else
cout<<ans;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...