北邮第二次机考

24点三

北邮第二次机考_第1张图片
穷举法

#include
using namespace std;
int main()
{
 int t, i, j, a, b, c, d, e;
 cin >> t;
 int card[5];
 int find = 0;
 for (i = 0; i < t; i++)
 {
  for (j = 0; j < 5; j++)
   cin >> card[j];
  for (a = -1; a <= 1; a++)
   for (b = -1; b <= 1; b++)
    for (c = -1; c <= 1; c++)
     for (d = -1; d <= 1; d++)
      for (e = -1; e <= 1; e++)
       if (a*card[0] + b*card[1] + c*card[2] + d*card[3] + e*card[4] == 24)//-1代表减 0代表不用 1代表加
        find = 1;
  if (find == 0)
   cout << "NO" << endl;
  else
   cout << "YES" << endl;
  find = 0;
 }
 return 0;
}

路标:

北邮第二次机考_第2张图片
方向分开写:

#include
#include
using namespace std;
int main()
{
 char stoneNum[25];
 cin >> stoneNum;
 int i;
 int len = strlen(stoneNum), dir = 1, x = 0, y = 0;
 for (i = 0; i < len; i++)
 {
  if (dir == 1)
  {
   switch (stoneNum[i])
   {
   case '1':x--; break;
   case '2': y++; dir = 2; break;
   case '3':y--; dir = 4; break;
   default:break;
   }
  }
  else if (dir == 2)
  {
   switch (stoneNum[i])
   {
   case '1':y++; break;
   case '2': x++; dir = 3; break;
   case '3':x--; dir = 1; break;
   default:break;
   }
  }
  else if (dir == 3)
  {
   switch (stoneNum[i])
   {
   case '1':x++; break;
   case '2': y--; dir = 4; break;
   case '3': y++; dir = 2; break;
   default:break;
   }
  }
  else if (dir == 4)
  {
   switch (stoneNum[i])
   {
   case '1':y--; break;
   case '2': x--; dir = 1; break;
   case '3':x++; dir = 3; break;
   default:break;
   }
  }
 }
 cout << len << ",";
 if (x > 0)  cout << "e";
 if (y > 0)  cout << "n";
 if (y < 0)  cout << "s";
 if (x < 0)  cout << "w";
 return 0;
}

更简洁的代码:

#include
using namespace std;
int main()
{
 int dir = 2;//0、1、2、3分别代表东、南、西、北 dir为当前方向 
 int  x = 0, y = 0, count;//x,y为坐标值 
 char t;
 //scanf("%c", &t);
 t = getchar();//cin不能读取回车,可用getchar()替代
 for (count = 0; t != '\n'; count++) //count路口计数 
 {
  switch (t)//根据路标指示及当前方向判断下一步行进方向 
  {
  case '2':dir = (dir + 1) % 4; break;
  case '3':dir = (dir + 3) % 4; break;
  }
  //前进!
  if (dir % 2 == 0) x = x - dir + 1;//根据行进方向修改相应坐标 
 //东西方向改变横坐标
  else y = y + dir - 2;//南北方向改变纵坐标
  //scanf("%c", &t);  //读取下一个字符
  t = getchar();
 }
 cout<<count<<",";//输出路口数 
 if (x>0) cout<<"e";//顺序输出最终方位 
 if (y>0) cout << "n";
 if (y<0)  cout << "s";
 if (x<0)  cout << "w";
 return 0;
}

你可能感兴趣的:(数据结构与算法)