/*
forward x 向前走x米。
back x 先轉向後,再走x米。
left x 先轉向左,再走x米。
right x 先轉向右,再走x米。
up x 先面向上,再走x米。
down x 先面向下,再走x米。
+x=0 -x=3
+y=1 -y=4
+z=2 -z=5
前面 +x
上面 +z
右面 +y
*/
#include
#include
#define L 12 //最長:"forward 10000"
/*初始位置 x=0 y=1 z=2 面朝+x=0*/
int x=0,y=1,z=2,change,p=0,up=2,down=5,left=4,right=1,behind=3,mid;
char str[L+1];
/*判斷方向改變*/
void change_p(char str[],int*nn )//輸入字符串和地址&p
{
switch(str[0])
{
case 'f':break;
case 'b':mid=*nn;*nn=behind;behind=mid;mid=left;left=right;right=mid;break;
case 'l':mid=*nn;*nn=left;left=behind;behind=right;right=mid;break;
case 'r':mid=*nn;*nn=right;right=behind;behind=left;left=mid;break;
case 'u':mid=*nn;*nn=up;up=behind;behind=down;down=mid;break;
case 'd':mid=*nn;*nn=down;down=behind;behind=up;up=mid;break;
default:printf_s("ERROR str\n");break;
}
}
void xyz(char str[],int pp,int*xx,int*yy,int*zz)
{
int sum=0,ii=1;
for(int i=12;i>=0;i--)
if(str[i]>=48&&str[i]<=57)
{
sum+=(str[i]-48)*ii;
ii*=10;
}
switch(pp)
{
case 0:*xx+=sum;break;
case 1:*yy+=sum;break;
case 2:*zz+=sum;break;
case 3:*xx-=sum;break;
case 4:*yy-=sum;break;
case 5:*zz-=sum;break;
default:printf_s("ERROR number\n");break;
}
}
int main()
{
int m,n;
scanf_s("%d",&m);getchar();
for(;m>0;m--)
{
scanf_s("%d",&n);fflush(stdin);
for(;n>0;n--)
{
gets_s(str);
change_p(str,&p);
xyz(str,p,&x,&y,&z);
fflush(stdin);
}
printf_s("%d %d %d %d\n",x,y,z,p);
}
system("pause");
return 0;
}
題目來自於BOJ宇航員問題:http://poj.org/problem?id=1835
我知道scanf函數讀入後,會在緩存區域剩下些東西。
當我嘗試使用getchar()取出多余內容時總是得不到想要的結果。
我想用gets讀入字符串,用自定義函數來從中取出整數使用。
scanf_s("%d",&n);
fflush(stdin);
for(;n>0;n--)
{
gets_s(str);
change_p(str,&p);
xyz(str,p,&x,&y,&z);
fflush(stdin);
}
輸入1//共有幾組數據
輸入6//讀入幾次字符串
left 10
right 11
up 12
down 13
forward 14
back 15
數據輸入結束
在實際輸入時,常常輸入完1、6後程序得出結果終止運行。從輸出數據來看,有幾次可以讀入字符串,但是均為'\0'。更多時候無法運行至gets函數就出結果。
最後我還嘗試了使用fflush函數清除緩存區域,任不得要領。
求指教。
scanf_s("&d",&n);這句話,確定對,不是%號?