返回列表 發帖

2021npsc_A_圈圈叉叉_C++解題

本帖最後由 鄭繼威 於 2022-10-29 12:08 編輯

A.圈圈叉叉
Problem ID: tictactoe

你有玩過圈圈叉叉嗎?圈圈叉叉,⼜稱井字棋,是一個在大小 3 × 3 的棋盤上玩的雙⼈遊戲。兩個玩家一人代表圈、一人代表叉,並且輪流在棋盤空的格子中放上自己的符號,而誰先連成一條線就贏了。

小 Y 是一個天才兒童,所以傳統 3 × 3 的圈圈叉叉對他來說已經太無趣了。因此,他發明了一種新的版本,並邀請他的好朋友小 P 一起來玩。小 Y 發明的版本是在⼀個 N × N 的棋盤上玩,與傳統的規則一樣,一人畫圈、另一人畫叉,並且拿圈的玩家先手。但與傳統的圈圈叉叉規則不一樣的是,小 Y 的遊戲比的不是誰先連成一條線,而是兩人會下到不能再下為止(也就是棋盤已經完全被佔滿),再看誰的連線比較多,一個玩家的得分就是他的連線數量,⽽很⾃然的,得分較⾼的玩家就勝出。
補充說明,在 N × N 的棋盤上,連線是指有同排、同列、或是同對⾓線的 N 個相同符號。

小 Y 跟小 P 都覺得新版的圈圈叉叉實在⽐舊版的好玩太多了,但他們馬上就遇到了一個問題:由於棋盤實在是太大了,遊戲結束後實在無法慢慢的用人力來算分。當然,寫個程式來處理這個問題對於天才兒童小 Y 來說可以說是易如反掌,但可想而知,他還有更重要的事情要做。因此,身為程式競賽參賽者的你們,何不幫幫小 Y 解決這個⿇煩的問題呢?







https://contest.cc.ntu.edu.tw/npsc2021/teamclient/contest_junior.pdf
  1. #include<iostream>
  2. #include<cstdlib>
  3. using namespace std;
  4. int main()
  5. {
  6.         ios::sync_with_stdio(0);      
  7.         cin.tie(0);
  8.       
  9.         int N;
  10.         cin>>N;
  11.         string s[N];  //宣告長度為N的 字串型態的陣列
  12.         for(int i=0;i<N;i++)
  13.                 cin>>s[i];  //把ooxx cin進字串陣列
  14.         int ocnt=0;
  15.         int xcnt=0;

  16.         //巢狀迴圈(2層)
  17.         for(int i=0;i<N;i++)
  18.         {
  19.         //第i行
  20.                 for(int j=0;j<N;j++)
  21.                 {
  22.                 //讀取ooxx(字元陣列)
  23.                         if(s[i][j]=='o')
  24.                                 ocnt++;
  25.                         else
  26.                                 xcnt++;
  27.                 }
  28.         }
  29.       
  30.         int o;
  31.         int oscore=0;
  32.         int xscore=0;
  33.         
  34.            //o先下手所以在奇數局會比x還多1次,(所以x那邊要+1才會平衡)
  35.         if(ocnt==xcnt||ocnt==xcnt+1)
  36.         {
  37.         //連線總共有4種狀況(橫、縱、斜X2)
  38.                 for(int i=0;i<N;i++){
  39.                 //橫的連線
  40.                         o=0;
  41.                         for(int j=0;j<N;j++){
  42.                                 if(s[i][j]=='o')
  43.                                         o++;
  44.                         }
  45.                         //如果連線就加分
  46.                         if(o==N)
  47.                                 oscore++;
  48.                         else if(o==0)
  49.                                 xscore++;
  50.                 }
  51.                
  52.                 for(int j=0;j<N;j++){
  53.                 //縱的連線
  54.                         o=0;
  55.                         for(int i=0;i<N;i++){
  56.                                 if(s[i][j]=='o')
  57.                                         o++;
  58.                         }
  59.                         //如果連線就加分
  60.                         if(o==N)
  61.                                 oscore++;
  62.                         else if(o==0)
  63.                                 xscore++;
  64.                 }
  65.                
  66.                 o=0;
  67.                 for(int i=0;i<N;i++){
  68.                         //斜的連線(左上至右下)
  69.                         if(s[i][i]=='o')
  70.                                 o++;
  71.                         }
  72.                         //如果連線就加分
  73.                         if(o==N)
  74.                                 oscore++;
  75.                         else if(o==0)
  76.                                 xscore++;
  77.                               
  78.                 o=0;
  79.                 for(int i=0;i<N;i++){
  80.                         //斜的連線(右上至左下)
  81.                         if(s[i][N-1-i]=='o')
  82.                                 o++;
  83.                         }
  84.                         //如果連線就加分
  85.                         if(o==N)
  86.                                 oscore++;
  87.                         else if(o==0)
  88.                                 xscore++;
  89.                
  90.                 cout<<oscore<<" "<<xscore<<endl;
  91.                
  92.         }else        
  93.                 cout<<"Impossible"<<endl;
  94.       
  95.         system("pause");
  96.         return 0;  
  97. }
複製代碼

返回列表