Codechef的益智游戏

时间:2020-07-14 06:20:35

标签: c++ sorting puzzle

有人可以在cpp中解释此问题的解决方案及其如何工作 使用STL可以提高效率吗?

http://www.codechef.com/problems/H1

如果您可以解释这种特殊的逻辑及其时间复杂性,将非常有帮助。


#include <cstdio>
using namespace std;
 
int board[9],q[178000]={123456789},powers[9]={100000000,10000000,1000000,100000,10000,1000,100,10,1};
int posn,fromposn,front=-1,back=1;
char found[98765435]={0};
bool prime[18]={0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1};
 
void moveit(int p1,int p2){
  int diff=board[p2]-board[p1];
  posn=fromposn+diff*powers[p1]-diff*powers[p2];
  int posndiv10=posn/10;
  if(!found[posndiv10]){
    found[posndiv10]=found[fromposn/10]+1;
    q[back++]=posn;
  }
}
 
int main(){
  int t,i,d;
 
#ifndef ONLINE_JUDGE
  freopen("in.txt","r",stdin);
#endif
  found[12345678]=1;
  while(++front<back){
    for(posn=fromposn=q[front],i=8;i>=0;i--){
      board[i]=posn%10;
      posn/=10;
    }
    if(prime[board[0]+board[1]]) moveit(0,1);
    if(prime[board[0]+board[3]]) moveit(0,3);
    if(prime[board[1]+board[2]]) moveit(1,2);
    if(prime[board[1]+board[4]]) moveit(1,4);
    if(prime[board[2]+board[5]]) moveit(2,5);
    if(prime[board[3]+board[4]]) moveit(3,4);
    if(prime[board[3]+board[6]]) moveit(3,6);
    if(prime[board[4]+board[5]]) moveit(4,5);
    if(prime[board[4]+board[7]]) moveit(4,7);
    if(prime[board[5]+board[8]]) moveit(5,8);
    if(prime[board[6]+board[7]]) moveit(6,7);
    if(prime[board[7]+board[8]]) moveit(7,8);
  }
  scanf("%d",&t);
  while(t--){
    for(posn=i=0;i<8;i++){
      scanf("%d",&d);
      posn=posn*10+d;
    }
    scanf("%d",&d);
    if(found[posn]) printf("%d\n",found[posn]-1);
    else puts("-1");
  }
  return 0;
}   

1 个答案:

答案 0 :(得分:0)

它首先建立一个所有可解决板的表格,以数字表示,说明该解决方案距解决方案有多少步骤。

然后通过在该表中查找来解决每个测试用例。

每个测试用例的时间复杂度是恒定的。

我怀疑标准库中是否有任何东西可以使其效率更高。

相关问题