---
# System prepended metadata

title: 資訊一乙Week13作業

---

# 資訊一乙Week13作業
## 題目敘述
給定一個編號N 產生編號 1 ~ N 的Circular Queue，分別有兩個人X先生與Y先生。
X先生從 1 往逆時針的方向走a 步，Y先生從N 往順時針的方向走b 步。若每次走到一個新位置之後，那個位置就再也不會走到了。
請設計一支程式能夠印出每次X先生與Y先生走到的位置。

輸入格式：  有多行測資，每行有三個數字N, a 及b（0 < N < 20, a, b > 0），N 代表此CircularQueue 的大小，a, b 分別為X先生及Y先生的步數。當N = a = b = 0 時結束程式。

輸出格式：  根據每筆測資輸出踩到的編號，輸出時請輸出範圍（field）是 3 的編號。每次都是先列出逆時針的人走到的位置，再來印出順時針的人走到的位置。如果走到位置相同，印一個數字即可。每個回合之間用 ',' 做分隔。
範例輸入：
```
10 4 3
0 0 0
```
範例輸出：
```
  4  8,  9  5,  3  1,  2  6, 10,  7
```
~~*好啦這個輸出我還是不知道是三小(題目敘述原始檔是pdf)*~~
~~*總之我是用全部%3d就是了*~~
___
## 我的做法
這一題我4用陣列做的，利用一個陣列，判斷有走過的位置就寫1，沒走過就是0

### 仙貝韓式
一個陣列 **walked** 就是判斷那個點有沒有走過，**aNow** 其實是X先生的位置啦，~~只是都寫好了就不改了~~，**size**就是這個circular queue的大小
這個函式就是讓aNow右移一格，這裡要注意右移如果超出大小要記得移到最左邊，還要注意這格有沒有被走過(```walked==1```)...等等的，可以自己想想看怎麼寫
```c
int rightMove(int* walked, int aNow, int size)
```
例(右移一格):
![](https://i.imgur.com/IiDiU9l.png)
![](https://i.imgur.com/zEipO8N.png)
![](https://i.imgur.com/ClvauXE.png)

有右移就有左移嘛
```c
int leftMove(int* walked, int bNow, int size)
```

這裡增加一個**step**來看右移幾格，~~實際上就是```rightMove```跑for迴圈啦~~
```c
int rightStep(int* walked, int aNow, int size, int step)
```

~~左右對稱才有美感~~
```c
int leftStep(int* walked, int bNow, int size, int step)
```
### 主函式
```c
int main(){
    /*
    先創一個size大小的walked陣列並初始化為零
    接著開始跑迴圈讓X向右 Y向左 設walked=1 print...
    跑到walked陣列裡都是1就行囉，是不是很簡單呢 (。U。)b
    */
}
```
___
## 遇到的問題
我一開始是X停到甚麼地方就立刻設walked為1，Y也是
但實際上他要我們做的是X往右跑，先不要管X跑到哪，Y先往左跑，到定點之後再把X跟Y的位置設為walked = 1，結束這一回合。
所以我**原本**的寫法會變這樣
![](https://i.imgur.com/0a6t4Rl.png)
![](https://i.imgur.com/cOonhLr.png)
![](https://i.imgur.com/jEEqF9H.png)
![](https://i.imgur.com/HspGnUj.png)


Y3會出現錯誤，因為題目的意思，這一輪還沒結束，所以X3的walked不應被標為1
![](https://i.imgur.com/VWRwdv5.png)
___
大概4這樣，有錯的話歡迎糾正