《算法竞赛入门经典2ndEdition 》习题3-5 谜题(Puzzle, Uva227)

真心虐心,昨天晚上从8点改到11点,自己测什么问题都没有,可就是不AC,于是就想格式方面的问题,后来还不对,一看去复制了一段别人的代码,替换了我中间的部分一测,AC了居然,于是终于知道了我是在哪一段出错的。
这个是我原来的代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cctype>
using namespace std;

char s[6][6];
int x, y;

int main()
{     
  freopen("New Text Document.txt","r",stdin);
  freopen("Output.txt","w",stdout);
  ios::sync_with_stdio(false);
  string str, order;
  int p = 0;
  while(1)
  {
    if(p != 0) cin.get();//´¦ÀíÖ¸ÁîÐÐÄ©»Ø³µ 
    memset(s, 0, sizeof(s));
    str.clear();
    getline(cin, str);//puzzleÀïÓпոñ£¬ÒªÓøögetline¶Áµ½stringÀïÈ»ºóÔÚתµ½¶þάÊý×éÖУ¬´Ë´¦½ö¶ÁÈëÒ»ÐÐ 
    if(str[0] == 'Z' ) break;
    if(p != 0) printf("\n");//´òӡÿ×éÊý¾Ý¼äµÄ¿ÕÐÐ 
    for(int j = 0; j < 5; j++)
      {
        s[0][j] = str[j];
        if(s[0][j] == ' ')
        {
          x = 0;
          y = j;
        }
      }
    for(int i = 1; i < 5; i++)
    {
      str.clear();
      getline(cin, str);//ͨ¹ýÑ­»·½«Ê£Óà4ÐжÁÈë 
      for(int j = 0; j < 5; j++)
      {
        s[i][j] = str[j];
        if(s[i][j] == ' ')
        {
          x = i;
          y = j;
        }
      }
    }
    //½«orderÇå¿Õ£¬²¢ÇÒ¶ÁÈëËùÓеÄÖ¸Áî 
    order.clear();
    while(1)
    {
      string appendix;
      cin>>appendix;
      order += appendix;
      int len = appendix.length();
      if(appendix[len-1] == '0')  break;
    }

    int len = order.length();
    bool flag = true;
    for(int i = 0; i < len-1; i++)
    {
      switch(order[i])
      {
        case 'A': 
             if(x == 0) flag = false;
             else s[x][y] = s[--x][y];
             break;
        case 'B': 
             if(x == 4) flag = false;
             else s[x][y] = s[++x][y]; 
             break;
        case 'R': 
             if(y == 4) flag = false;
             else s[x][y] = s[x][++y]; 
             break;
        case 'L': 
             if(y == 0) flag = false;
             else s[x][y] = s[x][--y]; 
             break;
        case '0': case '\n': break;
        default: flag = false;
      }
      if(!flag) break;
    }
   s[x][y] = ' ';//***********
    //Êä³ö 
    printf("Puzzle #%d:\n",++p);
    if(flag) 
      for(int i = 0; i < 5; i++)
        printf("%c %c %c %c %c\n",s[i][0],s[i][1],s[i][2],s[i][3],s[i][4]);
    else printf("This puzzle has no final configuration.\n");
  }
  return 0;
}

之前代码我在switch中没改空格,最后在*******号语句处加了改空格,但就是不对,目前仍不知道为什么。

这个 是AC代码。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cctype>
using namespace std;

char s[6][6];
int x, y;
//const char* turns = "ABLR";  
//int dx[] = {-1,1,0,0};  
//int dy[] = {0,0,-1,1};  
//
//bool move_p(char turn)  
//{  
//    int flag = 1;  
//    int t;  
//    if(turn == 'A') t =0;  
//    else if(turn == 'B') t =1;  
//    else if(turn == 'L') t =2;  
//    else if(turn == 'R') t =3;  
//    int xa,ya;  
//    xa = x + dx[t]; ya = y + dy[t];  
//    if(xa>=0&&xa<=4&&ya>=0&&ya<=4){  
//        s[x][y] = s[xa][ya];  
//        s[xa][ya] = ' ';  
//        x = xa; y =ya;  
//    }  
//    else flag = 0;  
//    if(flag) return true;  
//    else return false;  
//}  

int main()
{     
  freopen("New Text Document.txt","r",stdin);
  freopen("Output.txt","w",stdout);
  ios::sync_with_stdio(false);
  string str, order;
  int p = 0;
  while(1)
  {
    if(p != 0) cin.get();//处理指令行末回车
    memset(s, 0, sizeof(s));
    str.clear();
    getline(cin, str);//puzzle里有空格,要用getline读到string里再转到数組中
    if(str[0] == 'Z' ) break;
    if(p != 0) printf("\n");//打印每组数据之间的空行 
    for(int j = 0; j < 5; j++)
      {
        s[0][j] = str[j];
        if(s[0][j] == ' ')
        {
          x = 0;
          y = j;
        }
      }
    for(int i = 1; i < 5; i++)
    {
      str.clear();
      getline(cin, str);//读入剩余四行
      for(int j = 0; j < 5; j++)
      {
        s[i][j] = str[j];
        if(s[i][j] == ' ')
        {
          x = i;
          y = j;
        }
      }
    }
    //清空order并读入所有指令
    order.clear();
    while(1)
    {
      string appendix;
      cin>>appendix;
      order += appendix;
      int len = appendix.length();
      if(appendix[len-1] == '0')  break;
    }

    int len = order.length();
    bool flag = true;
    //下面这段for循环可以注释掉,然后替换成目前的所有注释部分,目前的注释部分是我从网上粘贴的
    for(int i = 0; i < len-1; i++)
    {
      switch(order[i])
      {
        case 'A': 
             if(x == 0) flag = false;
             else 
              {
               s[x][y] = s[x-1][y];
               s[--x][y] = ' ';
              } 
             break;
        case 'B': 
             if(x == 4) flag = false;
             else 
               {
               s[x][y] = s[x+1][y]; 
               s[++x][y] = ' ';
               } 
             break;
        case 'R': 
             if(y == 4) flag = false;
             else 
               {
               s[x][y] = s[x][y+1]; 
               s[x][++y] = ' ';
               }
             break;
        case 'L': 
             if(y == 0) flag = false;
             else {
               s[x][y] = s[x][y-1]; 
               s[x][--y] = ' ';
               }
             break;
        default: flag = false;
      }
      if(!flag) break;
    }

    //s[x][y] = 0;
        //for(int i=0;i<len-1;i++)  
//        {  
//            if(move_p(order[i])) continue;  
//            else { flag = false; break;}  
//        } 


    //打印
    printf("Puzzle #%d:\n",++p);
    if(flag) 
      for(int i = 0; i < 5; i++)
        printf("%c %c %c %c %c\n",s[i][0],s[i][1],s[i][2],s[i][3],s[i][4]);
    else printf("This puzzle has no final configuration.\n");
  }
  return 0;
}

这是我粘贴部分代码的原博主
http://blog.csdn.net/wowowoc/article/details/40059593
万分感谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值