伊莉討論區

標題: (已解決)C語言習題-黑暗角落 [打印本頁]

作者: asd13155913    時間: 2016-1-6 04:28 PM     標題: (已解決)C語言習題-黑暗角落

本帖最後由 asd13155913 於 2016-1-9 10:23 AM 編輯



作者: snowflying    時間: 2016-1-6 07:39 PM

本帖最後由 snowflying 於 2016-1-6 07:42 PM 編輯

7 ~ 9 行是輸入地圖資訊
10 ~ 13 是找出燈光位置,然後呼叫 light 函式,從該位置往上下左右點亮格子
14 ~ 21 行只是輸出地圖樣貌而已
22 ~ 25 去數沒被點亮的白色格子有幾個

要改成 C,標頭檔、輸入輸出、宣告處理一下,就差不多了
另外,void light(int x, int y, int* arr); 丟到 main 前面吧


作者: samou568    時間: 2016-1-7 01:05 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: asd13155913    時間: 2016-1-7 02:47 PM

本帖最後由 asd13155913 於 2016-1-7 02:49 PM 編輯
snowflying 發表於 2016-1-6 07:39 PM
7 ~ 9 行是輸入地圖資訊
10 ~ 13 是找出燈光位置,然後呼叫 light 函式,從該位置往上下左右點亮格子
14 ~  ...

請問C++的輸出輸入所對應C的輸出輸入是那些??



作者: snowflying    時間: 2016-1-7 03:01 PM

asd13155913 發表於 2016-1-7 02:47 PM
請問C++的輸出輸入所對應C的輸出輸入是那些??

要說對應有點難,因為可以說是不同的東西

C 比較常用的就是
scanf 系列 (scanf、sscanf、...)、getc、fgetc、getchar、fgets、gets 等等作為輸入
printf 系列 (printf、sprintf、...)、putc、fputc、putchar、fputs、puts 等等作為輸出

<stdio.h> 底下的函式大多都有機會用到,依據不同的情況使用不同的函式
可以試著大概練習一下
作者: asd13155913    時間: 2016-1-7 03:18 PM

本帖最後由 asd13155913 於 2016-1-7 03:20 PM 編輯
snowflying 發表於 2016-1-7 03:01 PM
要說對應有點難,因為可以說是不同的東西

C 比較常用的就是

恩!C的這部分了解!另外 下面的函數33~36行

換為C是要如何表示出來??不太清楚33~36行

的含意是如何....


作者: snowflying    時間: 2016-1-7 04:37 PM

asd13155913 發表於 2016-1-7 03:18 PM
恩!C的這部分了解!另外 下面的函數33~36行

換為C是要如何表示出來??不太清楚33~36行

二維陣列想像成一個座標平面
以這一行來說
for(int px=x-1, py=y; px>=0 && arr[px*k+py]==0 || arr[px*k+py]==3 ; px--) arr[px*k+py]=3;



int px=x-1, py=y 是宣告變數並初始化為 (x-1 , y)

px>=0 && arr[px*k+py]==0 || arr[px*k+py]==3 是判斷條件
px >= 0 限制住了範圍在 (x-1 , y) ~ (0 , y)
arr[px*k+py]==0 && arr[px*k+py]==0 || arr[px*k+py]==3
表示只接受白色格子,或者已被點亮的格子
因為遇到障礙物就停了,不需要繼續跑下去

px-- 是讓座標 x 一直減少,就是向某一個方向跑的意思

簡單講,那四行就是跑四個方向,直到撞到牆或障礙物為止

作者: dh3014    時間: 2016-1-8 12:05 AM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: asd13155913    時間: 2016-1-8 01:50 AM

本帖最後由 asd13155913 於 2016-1-12 10:43 PM 編輯
snowflying 發表於 2016-1-7 04:37 PM
二維陣列想像成一個座標平面
以這一行來說

卡住了...不知道下來要更動那些!!"((回復好像不能貼上程式碼...


作者: snowflying    時間: 2016-1-9 12:49 AM

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define print printf
  4. #define k 7

  5. void light(int x, int y, int* arr);

  6. int main()
  7. {
  8.   int arr[k][k] , count = 0 , x , y;
  9.   
  10.   for(y = 0 ; y < k ; y++)
  11.       for(x = 0 ; x < k ; x++)
  12.           scanf("%d" , &arr[x][y]);
  13.          
  14.   for(y = 0 ; y < k ; y++)
  15.       for(x = 0 ; x < k ; x++)
  16.           if( arr[x][y] == 2 )
  17.               light(x , y , arr[0]);
  18.               
  19.   for(y = 0 ; y < k ; y++)
  20.   {
  21.       for(x = 0 ; x < k ; x++)
  22.       {
  23.           if( arr[x][y] == 0 )      print("%s" , "□");
  24.           else if( arr[x][y] == 1 ) print("%s" , "■");
  25.           else if( arr[x][y] == 2 ) print("%s" , "◎");
  26.           else                    print("%s" , "‧");
  27.       }
  28.       putchar('\n');
  29.   }
  30.   
  31.   for(y = 0 ; y < k ; y++)
  32.       for(x = 0 ; x < k ; x++)
  33.           if( arr[x][y] == 0 )
  34.               count++;
  35.               
  36.   print("沒被照到的有:%d格\n" , count);            
  37.   system("pause");
  38. }
  39. void light(int x, int y, int* arr)
  40. {
  41.   int Sx = x , Sy = y , px , py;
  42.   //left up right down
  43.   for(px=x-1, py=y; px>=0 && arr[px*k+py]==0 || arr[px*k+py]==3 ; px--) arr[px*k+py]=3;
  44.   for(py=y-1, px=x; py>=0 && arr[px*k+py]==0 || arr[px*k+py]==3 ; py--) arr[px*k+py]=3;
  45.   for(px=x+1, py=y; px<k  && arr[px*k+py]==0 || arr[px*k+py]==3 ; px++) arr[px*k+py]=3;
  46.   for(py=y+1, px=x; py<k  && arr[px*k+py]==0 || arr[px*k+py]==3 ; py++) arr[px*k+py]=3;  
  47. }
複製代碼
因為 printf 加左刮號 是敏感字詞
所以用 print,前面加個 #define print printf

作者: zxc28157200    時間: 2017-6-28 11:04 PM

感謝各位大大的指引




歡迎光臨 伊莉討論區 (http://a401.file-static.com/) Powered by Discuz!