#include< iostream >
#include< algorithm >
#include< cstdio >
#include< cmath >
#include< cstring >
using namespace std;
int T,n,m,jia[10][10],vis[10],si,ti,MIN,mod=1e9+7;
long long ANS;
void dfs(int qi,int mo,int step)//起始位置,末位置,已有的步数;
{
if(qi==mo)
{
MIN=min(MIN,step);
return;
}//如果到达,更新答案;
dfs(mo,mo,step+abs(qi-mo));//不走新加进来的路,直接走链;
for(int i=0;i<3;i++)
for(int j=0;j<2;j++)//注意这里i,j必须从0开始,原因见下;
{
if(vis[i]==0)
{
vis[i]=1;
dfs(jia[i][!j],mo,step+abs(qi-jia[i][j])+1);//搜索走新加点的路,因为j是从0输入,所以jia[i][!j]就是新加的路靠近终点的那一端(如果靠近你的是0端,那!j就是跨过去靠近末位置的另一端)+1就是那条新加路的长度,因为你刚才计算的时候跨过了它;
vis[i]=0;//切记还原;
}
}
}
int main()
{
//这道题必须用scanf和printf输入输出;
scanf("%d",&T);
while(T--)
{
ANS=0;//切记还原;
scanf("%d%d",&n,&m);
int ans[m+10];
for(int i=0;i<3;i++)
{
scanf("%d%d",&jia[i][0],&jia[i][1]);//必须用0,1,因为dfs中写成jia[i][!j];
}
for(int i=1;i<=m;i++)
{
scanf("%d%d",&si,&ti);
MIN=abs(si-ti);
dfs(si,ti,0);
ans[i]=MIN;
}
for(int i=1;i<=m;i++)
{
ANS=(ANS+(long long)ans[i]*(long long)i)%mod;//强制类型转换;
}
printf("%I64d\n",ANS);
}
return 0;
}
这道题思路上并不复杂。。。。但是写成dfs的确是有很多小细节。。。
(膜拜gty大神)