加输出中间步骤可以输出正确答案,不加会卡死循环,求大佬帮忙解释:
加输出的代码:
#include<bits/stdc++.h>
using namespace std;
int a[15] , jiecheng[15] , memory[1000005] , p , vis[15] , b[15] = {0 , 1 , 2 , 3 , 8 , 0 , 4 , 7 , 6 , 5} , bx[15] , by[15];
char c;
void init()
{
cin >> c;
a[1] = c - '0';
if(c == '0')
{
p = 1;
}
cin >> c;
a[2] = c - '0';
if(c == '0')
{
p = 2;
}
cin >> c;
a[3] = c - '0';
if(c == '0')
{
p = 3;
}
cin >> c;
a[4] = c - '0';
if(c == '0')
{
p = 4;
}
cin >> c;
a[5] = c - '0';
if(c == '0')
{
p = 5;
}
cin >> c;
a[6] = c - '0';
if(c == '0')
{
p = 6;
}
cin >> c;
a[7] = c - '0';
if(c == '0')
{
p = 7;
}
cin >> c;
a[8] = c - '0';
if(c == '0')
{
p = 8;
}
cin >> c;
a[9] = c - '0';
if(c == '0')
{
p = 8;
}
jiecheng[0] = 1;
for(int i = 1 ; i <= 9 ; i++)
{
jiecheng[i] = jiecheng[i - 1] * i;
}
for(int i = 1 ; i <= 362880 ; i++)
{
if(i == 46686)
{
memory[i] = 0;
continue;
}
memory[i] = -1;
}
for(int i = 0 ; i < 3 ; i++)
{
for(int j = 1 ; j <= 3 ; j++)
{
by[b[i * 3 + j]] = i;
bx[b[i * 3 + j]] = j;
}
}
return;
}
int kangtuo()
{
int cnt = 0 , tmp = 0;
for(int i = 1 ; i <= 9 ; i++)
{
tmp = a[i];
for(int j = 1 ; j < i ; j++)
{
if(a[j] < a[i])
{
tmp--;
}
}
cnt += tmp * jiecheng[9 - i];
}
return cnt + 1;
}
int far()
{
int ax[15] , ay[15] , cnt;
for(int i = 0 ; i < 3 ; i++)
{
for(int j = 1 ; j <= 3 ; j++)
{
ay[a[i * 3 + j]] = i;
ax[a[i * 3 + j]] = j;
}
}
for(int i = 1 ; i <= 9 ; i++)
{
cnt += abs(bx[i] - ax[i]) + abs(by[i] - ay[i]);
}
return cnt;
}
int dfs(int place)
{
if(memory[kangtuo()] != -1)
{
return memory[kangtuo()];
}
for(int i = 1 ; i <= 9 ; i++)
{
cout << a[i];
}
cout << endl;
int cnt = 1000000007 , farn = far();
if(place - 1 > 0 && !vis[place - 1])
{
swap(a[place] , a[place - 1]);
if(far() < farn)
{
cnt = min(cnt , dfs(place - 1) + 1);
}
swap(a[place] , a[place - 1]);
}
if(place - 3 > 0 && !vis[place - 3])
{
swap(a[place] , a[place - 3]);
if(far() < farn)
{
cnt = min(cnt , dfs(place - 3) + 1);
}
swap(a[place] , a[place - 3]);
}
if(place + 1 < 10 && !vis[place + 1])
{
swap(a[place] , a[place + 1]);
if(far() < farn)
{
cnt = min(cnt , dfs(place + 1) + 1);
}
swap(a[place] , a[place + 1]);
}
if(place + 3 < 10 && !vis[place + 3])
{
swap(a[place] , a[place + 3]);
if(far() < farn)
{
cnt = min(cnt , dfs(place + 3) + 1);
}
swap(a[place] , a[place + 3]);
}
memory[kangtuo()] = cnt;
return cnt;
}
int main()
{
ios::sync_with_stdio(0);
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
init();
cout << dfs(p);
return 0;
}
不加的代码:
#include<bits/stdc++.h>
using namespace std;
int a[15] , jiecheng[15] , memory[1000005] , p , vis[15] , b[15] = {0 , 1 , 2 , 3 , 8 , 0 , 4 , 7 , 6 , 5} , bx[15] , by[15];
char c;
void init()
{
cin >> c;
a[1] = c - '0';
if(c == '0')
{
p = 1;
}
cin >> c;
a[2] = c - '0';
if(c == '0')
{
p = 2;
}
cin >> c;
a[3] = c - '0';
if(c == '0')
{
p = 3;
}
cin >> c;
a[4] = c - '0';
if(c == '0')
{
p = 4;
}
cin >> c;
a[5] = c - '0';
if(c == '0')
{
p = 5;
}
cin >> c;
a[6] = c - '0';
if(c == '0')
{
p = 6;
}
cin >> c;
a[7] = c - '0';
if(c == '0')
{
p = 7;
}
cin >> c;
a[8] = c - '0';
if(c == '0')
{
p = 8;
}
cin >> c;
a[9] = c - '0';
if(c == '0')
{
p = 8;
}
jiecheng[0] = 1;
for(int i = 1 ; i <= 9 ; i++)
{
jiecheng[i] = jiecheng[i - 1] * i;
}
for(int i = 1 ; i <= 362880 ; i++)
{
if(i == 46686)
{
memory[i] = 0;
continue;
}
memory[i] = -1;
}
for(int i = 0 ; i < 3 ; i++)
{
for(int j = 1 ; j <= 3 ; j++)
{
by[b[i * 3 + j]] = i;
bx[b[i * 3 + j]] = j;
}
}
return;
}
int kangtuo()
{
int cnt = 0 , tmp = 0;
for(int i = 1 ; i <= 9 ; i++)
{
tmp = a[i];
for(int j = 1 ; j < i ; j++)
{
if(a[j] < a[i])
{
tmp--;
}
}
cnt += tmp * jiecheng[9 - i];
}
return cnt + 1;
}
int far()
{
int ax[15] , ay[15] , cnt;
for(int i = 0 ; i < 3 ; i++)
{
for(int j = 1 ; j <= 3 ; j++)
{
ay[a[i * 3 + j]] = i;
ax[a[i * 3 + j]] = j;
}
}
for(int i = 1 ; i <= 9 ; i++)
{
cnt += abs(bx[i] - ax[i]) + abs(by[i] - ay[i]);
}
return cnt;
}
int dfs(int place)
{
if(memory[kangtuo()] != -1)
{
return memory[kangtuo()];
}
int cnt = 1000000007 , farn = far();
if(place - 1 > 0 && !vis[place - 1])
{
swap(a[place] , a[place - 1]);
if(far() < farn)
{
cnt = min(cnt , dfs(place - 1) + 1);
}
swap(a[place] , a[place - 1]);
}
if(place - 3 > 0 && !vis[place - 3])
{
swap(a[place] , a[place - 3]);
if(far() < farn)
{
cnt = min(cnt , dfs(place - 3) + 1);
}
swap(a[place] , a[place - 3]);
}
if(place + 1 < 10 && !vis[place + 1])
{
swap(a[place] , a[place + 1]);
if(far() < farn)
{
cnt = min(cnt , dfs(place + 1) + 1);
}
swap(a[place] , a[place + 1]);
}
if(place + 3 < 10 && !vis[place + 3])
{
swap(a[place] , a[place + 3]);
if(far() < farn)
{
cnt = min(cnt , dfs(place + 3) + 1);
}
swap(a[place] , a[place + 3]);
}
memory[kangtuo()] = cnt;
return cnt;
}
int main()
{
ios::sync_with_stdio(0);
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
init();
cout << dfs(p);
return 0;
}
题目:here
感谢所有帮忙的大佬