leetcode348. 判定井字棋勝負 好麻煩的代碼

請在 n ×?n 的棋盤上,實現一個判定井字棋(Tic-Tac-Toe)勝負的神器,判斷每一次玩家落子后,是否有勝出的玩家。

在這個井字棋游戲中,會有 2 名玩家,他們將輪流在棋盤上放置自己的棋子。

在實現這個判定器的過程中,你可以假設以下這些規則一定成立:

??????1. 每一步棋都是在棋盤內的,并且只能被放置在一個空的格子里;

??????2. 一旦游戲中有一名玩家勝出的話,游戲將不能再繼續;

??????3. 一個玩家如果在同一行、同一列或者同一斜對角線上都放置了自己的棋子,那么他便獲得勝利。

示例:

給定棋盤邊長 n = 3, 玩家 1 的棋子符號是 "X",玩家 2 的棋子符號是 "O"。

TicTacToe toe = new TicTacToe(3);

toe.move(0, 0, 1); -> 函數返回 0 (此時,暫時沒有玩家贏得這場對決)
|X| | |
| | | | ? ?// 玩家 1 在 (0, 0) 落子。
| | | |

toe.move(0, 2, 2); -> 函數返回 0 (暫時沒有玩家贏得本場比賽)
|X| |O|
| | | | ? ?// 玩家 2 在 (0, 2) 落子。
| | | |

toe.move(2, 2, 1); -> 函數返回 0 (暫時沒有玩家贏得比賽)
|X| |O|
| | | | ? ?// 玩家 1 在 (2, 2) 落子。
| | |X|

toe.move(1, 1, 2); -> 函數返回 0 (暫沒有玩家贏得比賽)
|X| |O|
| |O| | ? ?// 玩家 2 在 (1, 1) 落子。
| | |X|

toe.move(2, 0, 1); -> 函數返回 0 (暫無玩家贏得比賽)
|X| |O|
| |O| | ? ?// 玩家 1 在 (2, 0) 落子。
|X| |X|

toe.move(1, 0, 2); -> 函數返回 0 (沒有玩家贏得比賽)
|X| |O|
|O|O| | ? ?// 玩家 2 在 (1, 0) 落子.
|X| |X|

toe.move(2, 1, 1); -> 函數返回 1 (此時,玩家 1 贏得了該場比賽)
|X| |O|
|O|O| | ? ?// 玩家 1 在 (2, 1) 落子。
|X|X|X|
?

進階:
您有沒有可能將每一步的?move()?操作優化到比?O(n2) 更快嗎?

題意因該是想每一次move都把棋盤全部檢查一遍,但是沒必要。

進階的意思:只把新move位置的所在行、列、和兩個對角線檢查一下即可,時間o(n),空間o(n*n)代碼如下。

class TicTacToe {int arr[][];/** Initialize your data structure here. */public TicTacToe(int n) {arr=new int[n][n];}/** Player {player} makes a move at ({row}, {col}).@param row The row of the board.@param col The column of the board.@param player The player, can be either 1 or 2.@return The current winning condition, can be either:0: No one wins.1: Player 1 wins.2: Player 2 wins. */public int move(int row, int col, int player) {arr[row][col]=player;if(checkCol(col,player) || checkRow(row,player) || line1(player) || line2(player)){return player;}return 0;}public boolean checkRow(int row,int player) {int len=arr.length;for(int i=0;i<len;i++){if(arr[row][i]!=player){return false;}}return true;}public boolean checkCol(int col,int player) {int len=arr.length;for(int i=0;i<len;i++){if(arr[i][col]!=player){return false;}}return true;}public boolean line1(int player){int len=arr.length;int ans=0;for(int i=0;i<len;i++){if(arr[i][i]!=player){return false;}}return true;}public boolean line2(int player){int len=arr.length;int ans=0;for(int i=0;i<len;i++){if(arr[i][len-i-1]!=player){return false;}}return true;}}/*** Your TicTacToe object will be instantiated and called as such:* TicTacToe obj = new TicTacToe(n);* int param_1 = obj.move(row,col,player);*/

更好的思路,把每一行每一列,和兩個對角線的情況記錄下來,玩家1使所在行列對角線-1,玩家1使所在行列對角線+1.

只有某個數等于n或-n時,某個玩家會獲勝。

class TicTacToe {int rowArr[];int colArr[];int line1=0;int line2=0;/** Initialize your data structure here. */public TicTacToe(int n) {rowArr=new int[n];colArr=new int[n];}/** Player {player} makes a move at ({row}, {col}).@param row The row of the board.@param col The column of the board.@param player The player, can be either 1 or 2.@return The current winning condition, can be either:0: No one wins.1: Player 1 wins.2: Player 2 wins. */public int move(int row, int col, int player) {int n=rowArr.length;int temp=player==1?-1:1;rowArr[row]+=temp;colArr[col]+=temp;if(row==col){line1+=temp;}if(col==n-row-1){line2+=temp;}if(rowArr[row]==n || colArr[col]==n || rowArr[row]==-n || colArr[col]==-n || line1==n || line2==n || line1==-n || line2==-n){return player;}return 0;}}/*** Your TicTacToe object will be instantiated and called as such:* TicTacToe obj = new TicTacToe(n);* int param_1 = obj.move(row,col,player);*/

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444463.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444463.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444463.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++:17---sizeof運算符

功能:以字節位單位,返回一個表達式或一個數據類型所占的字節數返回值類型:是size_t類型sizeof有無括號:sizeof不加括號,后面不可以直接跟數據類型sizeof加括號,后面既可以跟表達式也可以跟數據類型注意事項對引用類型執行sizeof運算得到被引用對象所占空間的大小對指針執…

leetcode345. 反轉字符串中的元音字母

編寫一個函數&#xff0c;以字符串作為輸入&#xff0c;反轉該字符串中的元音字母。 示例 1: 輸入: "hello" 輸出: "holle" 示例 2: 輸入: "leetcode" 輸出: "leotcede" 說明: 元音字母不包含字母"y"。 思路&#xff1a…

Redis:10---List對象

一、列表對象概述列表類型是用來存儲多個有序的字符串&#xff0c;一個列表最多可以存儲多個元素。列表是一種比較靈活的數據結構&#xff0c;它可以充當棧和隊列的角色&#xff0c;在實際開發上有很多應用場景特點&#xff1a;一個列表可以存儲多個字符串&#xff0c;相同元素…

Redis:09---Hash對象

一、哈希對象簡介幾乎所有的編程語言都提供了哈希&#xff08;hash&#xff09;類型&#xff0c;它們的叫法可能是哈希、字典、關聯數組哈希又稱散列在Redis中&#xff0c;哈希類型是指鍵值本身又是一個鍵值對結構&#xff0c;形如value{{field1&#xff0c;value1}&#xff0c…

leetcode329. 矩陣中的最長遞增路徑

給定一個整數矩陣&#xff0c;找出最長遞增路徑的長度。 對于每個單元格&#xff0c;你可以往上&#xff0c;下&#xff0c;左&#xff0c;右四個方向移動。 你不能在對角線方向上移動或移動到邊界外&#xff08;即不允許環繞&#xff09;。 示例 1: 輸入: nums [ [9,9,…

Query Ajax 實例 ($.ajax、$.post、$.get)

Jquery在異步提交方面封裝的很好&#xff0c;直接用AJAX非常麻煩&#xff0c;Jquery大大簡化了我們的操作&#xff0c;不用考慮瀏覽器的詫異了。 推薦一篇不錯的jQuery Ajax 實例文章&#xff0c;忘記了可以去看看&#xff0c;地址為&#xff1a;http://www.cnblogs.com/yeer/a…

C++:18---const關鍵字(附常量指針、指針常量、常量指針常量)

一、const變量的一些基本特點 ①const修飾的變量不能被修改const int a=10; a=20;//錯誤②因為const修飾的變量不能被修改,所以必須被初始化int a=10; const int b=a; //正確 const int c=10; //正確③const修飾的變量可以賦值給其他值const int a=10; int b=a;//正確④可以有…

C:01---數據類型與ASCII

一、整型 int 取值范圍:-32768~32767unsigned int 取值范圍:0~65535short /short int 取值范圍:比int小unsigned short 無符號短整型long 長整型定義時,后面加上l或L有符號與無符號數: unsigned:無符號數,一般用來表示數據signed:有符號數,一般用來表示數字整型占…

leetcode330. 按要求補齊數組 頂級難度玄學貪心

給定一個已排序的正整數數組 nums&#xff0c;和一個正整數 n 。從 [1, n] 區間內選取任意個數字補充到 nums 中&#xff0c;使得 [1, n] 區間內的任何數字都可以用 nums 中某幾個數字的和來表示。請輸出滿足上述要求的最少需要補充的數字個數。 示例 1: 輸入: nums [1,3], …

C:02---scanf、printf

一、printf 控制符 ①精度控制:輸入小數點后m位(%.mf)。右對齊5位,保留小數點后m位(%d.mf)%f、%lf默認輸出6位小數②寬度:%md(打印m為,右對齊,多出m位照常打印)。%-md(打印m位,左對齊,多出m位照常打印)③長度:h表示短(打印短整型short:%hd),l表示長(打印長…

C++:20---成員變量初始化方式

成員變量初始化有三種方式: 在構造函數體內賦值初始化在自定義的公有函數體中賦值初始化(一般用于成員變量的初始化)在構造函數的成員初始化列表初始化一、構造函數體內初始化 說明:在構造函數體內的初始化方式,本質是是為成員變量賦值,而不是真正意義上的初始化,這點要…

leetcode339. 嵌套列表權重和

給定一個嵌套的整數列表&#xff0c;請返回該列表按深度加權后所有整數的總和。 每個元素要么是整數&#xff0c;要么是列表。同時&#xff0c;列表中元素同樣也可以是整數或者是另一個列表。 示例 1: 輸入: [[1,1],2,[1,1]] 輸出: 10 解釋: 因為列表中有四個深度為 2 的 1…

C++:19---this指針

一、this指針介紹 概念:this指針是成員函數的一個隱式參數,在類中本質上就是對象的指針(常量指針)特點:在成員函數中可通過this指針區別成員變量與形參變量this可以顯式調用示例代碼:class Cperson{private:int age;float height;public:void InitPerson(int age,float hei…

leetcode346. 數據流中的移動平均值

給定一個整數數據流和一個窗口大小&#xff0c;根據該滑動窗口的大小&#xff0c;計算其所有整數的移動平均值。 示例: MovingAverage m new MovingAverage(3); m.next(1) 1 m.next(10) (1 10) / 2 m.next(3) (1 10 3) / 3 m.next(5) (10 3 5) / 3 思路&#xff1…

(二十)TCPIP面試寶典-進入大廠必備總結(中)

TCP 作為傳輸層的協議,是一個IT工程師素養的體現,也是面試中經常被問到的知識點。在此,我將 TCP 核心的一些問題梳理了一下,希望能幫到各位。 實際上這篇文章相當于是復習之前的網絡基礎部分。只不過這篇文章的提問方式更靈活,也是讓讀者們懂得變通,更熟悉TCP。 前兩篇文…

leetcode263. 丑數

編寫一個程序判斷給定的數是否為丑數。 丑數就是只包含質因數 2, 3, 5 的正整數。 示例 1: 輸入: 6 輸出: true 解釋: 6 2 3 示例 2: 輸入: 8 輸出: true 解釋: 8 2 2 2 示例 3: 輸入: 14 輸出: false 解釋: 14 不是丑數&#xff0c;因為它包含了另外一個質因數 7。…

(二十一)TCPIP面試寶典-進入大廠必備總結(下)

TCP 作為傳輸層的協議,是一個IT工程師素養的體現,也是面試中經常被問到的知識點。在此,我將 TCP 核心的一些問題梳理了一下,希望能幫到各位。 實際上這篇文章相當于是復習之前的網絡基礎部分。只不過這篇文章的提問方式更靈活,也是讓讀者們懂得變通,更熟悉TCP。 上一篇文…

C++:23 再議const的用法(下)

上一篇文章折騰了一波粉絲,那么這一篇文章稍微溫柔一些。 我主要開始說如何正確使用const 1.不能將const 修飾的任何對象、引用和指針作為賦值表達式的左值。 const int cx=100; const int & rcx=cx; const int * pcx=&cx; cx=200; //error rcx=200; //error *pcx=200…

C++:22 再議const的作用(上)

我在C++:18篇里說過const的用法,這里我有必要再提升進階下const的理解。 因為你可能只知道他是怎么用的,但是他為什么這樣用,其他用法呢? 首先回顧下const有什么主要的作用? (1)可以定義const常量,具有不可變性。 (2)便于進行類型檢查,使編譯器對處理內容有更多了解…

leetcode57. 插入區間

給出一個無重疊的 &#xff0c;按照區間起始端點排序的區間列表。 在列表中插入一個新的區間&#xff0c;你需要確保列表中的區間仍然有序且不重疊&#xff08;如果有必要的話&#xff0c;可以合并區間&#xff09;。 示例 1: 輸入: intervals [[1,3],[6,9]], newInterval …