poj 2488

来源:互联网 发布:仓廪实而知礼节 编辑:程序博客网 时间:2024/06/06 13:20



字典序 x 1-7 y A-B
 {-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}

深度搜索如果避免存在回边的情况,即马要不重复的走过所有格。


点击(此处)折叠或打开

  1. #include <iostream>
  2. #include <list>
  3. #include <cstring>

  4. using namespace std;


  5. #define MAX_V (26+1)
  6. char board[MAX_V][MAX_V];
  7. int p,q,n;

  8. struct move
  9. {
  10.     int i;
  11.     int j;
  12. //}MOVE[8]={{1,-2},{-1,-2},{2,-1},{-2,-1},{2,1},{-2,1},{1,2},{-1,2}};
  13. //}MOVE[8]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2},};
  14. //}MOVE[8]={{2,-1},{1,-2},{1,-2},{2,-1},{2,1},{1,2},{-1,2},{-2,1}};
  15. //}MOVE[8]={{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}};
  16. }MOVE[8]={ {-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};
  17. //}MOVE[8]={{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}};

  18. struct qv
  19. {
  20.     int i;
  21.     int j;
  22. };


  23. list<struct qv> dfsList;

  24. int is_valid(int i,int j)
  25. {
  26.     if(i < 1 || i> p)
  27.         return 0;
  28.     if(j< 1 || j> q)
  29.         return 0;

  30.     return 1;
  31. }
  32. int dfsVisit(int i,int j)
  33. {
  34.     
  35.     board[i][j]=1;    
  36.     struct qv _qv = {i,j};
  37.     dfsList.push_back(_qv);

  38.     if(dfsList.size() == p*q)
  39.         return 1;

  40.     for(int m=0;m<8;m++)
  41.     {
  42.         int mi=MOVE[m].i +i;
  43.         int mj = MOVE[m].j +j;

  44.         if(!is_valid(mi,mj))
  45.             continue;
  46.         if(board[mi][mj] == 0)
  47.         {
  48.             if(dfsVisit(mi,mj))
  49.             {
  50.                 return 1;
  51.             }
  52.         }
  53.     }

  54.     board[i][j]=0;
  55.     dfsList.pop_back();
  56.     return 0;
  57. }

  58. int dfs()
  59. {
  60.         for(int i=1;i<=p;i++)
  61.         {
  62.             for(int j=1;j<=q;j++)
  63.             {
  64.                 memset(board,0,sizeof(board));
  65.                 dfsList.erase(dfsList.begin(),dfsList.end());
  66.                 //try start with i,j
  67.                 dfsVisit(i,j);    
  68.                 //cout<<"after dfs i:"<<i<<"j:"<<j<<"size:"<<dfsList.size()<<endl;

  69.                 if(dfsList.size() == p*q)
  70.                 {
  71.                     return 1;
  72.                 }
  73.             }
  74.         }

  75.         return 0;
  76. }

  77. int index_v=1;
  78. int main()
  79. {
  80.     cin >> n;
  81.     for(int k=1;k<=n;k++)
  82.     {
  83.         cin >>p>>q;
  84.         //cout<<"p:"<<p<<"q:"<<q<<endl;

  85.         cout<<"Scenario #"<<index_v<<":"<<endl;
  86.         if(dfs())
  87.         {
  88.             for(list<struct qv>::iterator lIter = dfsList.begin();
  89.                     lIter != dfsList.end();
  90.                     ++lIter)
  91.             {
  92.                 struct qv _qv = (*lIter);
  93.                 cout<<(char)(_qv.j+'A'-1)<<_qv.i;
  94.             }
  95.             cout<<endl;
  96.         }
  97.         else
  98.         {
  99.             cout<<"impossible"<<endl;
  100.         }
  101.         cout<<endl;

  102.         index_v++;
  103.     }
  104. }



阅读(11) | 评论(0) | 转发(0) |
0

上一篇:poj 2240

下一篇:poj 1321

相关热门文章
  • linux 常见服务端口
  • 【ROOTFS搭建】busybox的httpd...
  • 什么是shell
  • linux socket的bug??
  • linux的线程是否受到了保护?...
  • cpu %和load average是怎样的...
  • 如何确定线程使用的端口...
  • mysql整形数据类型插入0001数...
  • weblogic集群下启动服务有一个...
  • Ajax 权限验证
给主人留下些什么吧!~~
原创粉丝点击