【题目大意】
给你一个5*5的棋盘,被24个字母和1个空格填满。A、B、L、R分别表示空格向上向下向左向右移动的命令,给出初始棋盘,给出一段命令,求出最终棋盘的样子。
【解题思路】
注意空格在边界的情况,模拟棋盘移动,每一次命令交换空格与上下左右之一空格中的字母,有任一一条不合理的命令,便可以判断走法有问题。
【解题代码】
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn=3e4+5;
int vis[maxn];
int yushu[maxn];
int up,down;
int main()
{
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
int kcase=0;
while(~scanf("%d%d",&up,&down))
{
memset(vis,0,sizeof(vis));
memset(yushu,0,sizeof(yushu));
//输出相除的形式
printf("%d/%d = ",up,down);
//先输出整数部分
int circle=0;
int z=up/down;
yushu[0]=z;
int yu=up%down*10;
if(yu==0)//判断是否恰整除
{
printf("%d.(0)\n",z);
printf(" 1 = number of digits in repeating cycle\n");
continue;
}
else//不恰好整除
{
int i=1;
while(yu)//有限循环则退出
{
if(vis[yu])
{
circle=i-vis[yu];//i是当前位置,vis[yu]是上一次出现该被除数的位置。
break;
}
vis[yu]=i; //储存第一次出现该值得位置。
yushu[i]=yu/down;
i++;
yu=yu%down*10;
}
printf("%d.",yushu[0]);
if(!yu)
{
for(int j=1;j<i;j++)
printf("%d",yushu[j]);
printf("(0)\n 1 = number of digits in repeating cycle\n") ;
}
else//有循环节
{
int count=0;
for(int j=1;j<vis[yu];j++)
{
printf("%d",yushu[j]);
count++;
}
printf("(");
for(int j=vis[yu];j<i;j++)
{
if(count>=50)
{
printf("...");
break;
}
printf("%d",yushu[j]);
count++;
}
printf(")\n");
printf(" %d = number of digits in repeating cycle\n\n",circle);
}
}
}
return 0;
}
【收获与反思】
1.多思考多见识。
2.学会知识的融会贯通。