这是来自Google Code Jam资格回合的问题(现已结束).如何解决这个问题呢?
注意:如果您的方法与答案中讨论的方法不同,请分享,以便我们扩展我们对解决此问题的不同方法的了解.
扫雷是一种计算机游戏,在20世纪80年代开始流行,并且仍然包含在某些版本的Microsoft Windows操作系统中.这个问题有类似的想法,但它并不假设你玩过扫雷.
在这个问题中,您正在相同单元格的网格上玩游戏.最初隐藏每个单元格的内容.在M个不同的网格单元中隐藏着M个矿井.没有其他细胞包含地雷.您可以单击任何单元格以显示它.如果揭示的细胞包含一个矿,那么游戏就结束了,你输了.否则,显示的单元格将包含0到8之间的数字(包括0和8),这对应于包含地雷的相邻单元格的数量.如果两个单元共享一个角或边,则它们是邻居.另外,如果显示的单元格包含0,那么所揭示的单元格的所有邻居也会以递归方式自动显示.当所有不包含地雷的细胞都被揭露时,游戏结束,你就赢了.
例如,电路板的初始配置可能如下所示('*'表示我的,而'c'是第一个单击的单元格):
*..*...**.
....*.....
..c..*....
........*.
..........
Run Code Online (Sandbox Code Playgroud)
点击的单元格旁边没有地雷,因此当它被显示时,它变为0,并且它的8个相邻单元也被显示出来.此过程继续,导致以下板:
*..*...**.
1112*.....
00012*....
00001111*.
00000001..
Run Code Online (Sandbox Code Playgroud)
此时,仍有未显示的单元格不包含地雷(用'.'字符表示),因此玩家必须再次点击才能继续游戏.
你想尽快赢得比赛.没有什么比单击赢得更快.考虑到电路板的尺寸(R x C)和隐藏的地雷M的数量,是否有可能(但不太可能)一键获胜?您可以选择单击的位置.如果可能,则按照"输出"部分中的规范打印任何有效的矿井配置和点击坐标.否则,打印"不可能".
我试过的解决方案:
因此,对于解决方案,您需要确保每个非采矿节点与其他非采矿节点处于3x3矩阵中,或者如果节点位于网格边缘,则需要3x2或2x2矩阵; 我们称之为0Matrix.因此,0Matrix中的任何节点都具有所有非矿井邻居.
首先,检查是否需要更少的地雷,或更少的空节点
if(# mines required < 1/3 of total grid size)
// Initialize the grid to all clear nodes and populate the mines
foreach (Node A : the set of non-mine nodes)
foreach (Node AN : A.neighbors)
if AN forms a OMatrix with it's neighbors, continue
else break;
// If we got here means …Run Code Online (Sandbox Code Playgroud) 
根据这里的算法,看看我在"X"的情况,发生以下情况:
场景: i - >"X","X">"P"
1. swap("X", "Z"), gt--; // the value at i is now "Z", which is still > "P"
2. swap("Z", "Y"), gt--; // the value at i is now "Y", which is still > "P"
3. swap("Y", "C"), gt--; // Now we finally get a value at i "C" which is < "P"
// Now we can swap values at i and lt, and increrement them
4. swap("P", "C"), i++, lt++;
Run Code Online (Sandbox Code Playgroud)
为什么我们不直接递减gt,直到gt指向<lt的值(在这种情况下为"P"),然后我们将此值与i处的值交换.这将节省交换操作.
因此,如果我们为上述场景做到这一点,我们将做:
1. gt--
2. …Run Code Online (Sandbox Code Playgroud) 我已经看过如何使用Jersey Client API在RESTful调用上添加Headers,但这适用于Jersey 1.x.
如何在Jersey 2.21中设置标头值(例如授权令牌)?
这是我正在使用的代码:
public static String POST(final String url, final HashMap<String, String> params)
{
ClientConfig config = new ClientConfig();
Client client = ClientBuilder.newClient(config);
WebTarget target = client.target(url);
String data = new Gson().toJson(params);
Entity json = Entity.entity(data, MediaType.APPLICATION_JSON_TYPE);
Invocation.Builder builder = target.request(MediaType.APPLICATION_JSON_TYPE);
return builder.post(json, String.class);
}
Run Code Online (Sandbox Code Playgroud) 我确信有一种简单的方法可以做到这一点,但我似乎无法找到它.这是我的代码
export class UserLoginComponent {
private user: User;
public authService: AuthService;
constructor(private cognitoConfigs: CognitoUtil, authService: AuthService) {
this.user = new User();
this.authService = authService;
}
authenticate() {
// Some work being done here
let cognitoUser = new AWSCognito.CognitoIdentityServiceProvider.CognitoUser(userData);
cognitoUser.authenticateUser(authenticationDetails, {
onSuccess: function(result: any) {
this.authService.login(this.user, result);
},
onFailure: function(err: any) {
console.log(err.message);
},
});
}
}
Run Code Online (Sandbox Code Playgroud)
问题:在onSuccess回调中,我无法访问this.authService属于它的父类的变量.
现在将默认方法添加到Java 8中,有没有办法创建默认构造函数?
我试过了:
public interface KadContent<T>
{
public default KadContent()
{
}
...
Run Code Online (Sandbox Code Playgroud)
<identifier> expected从Netbeans 获取错误
为什么需要?我正在使用Gson序列化对象并获得"无法调用no-args构造函数.."错误,我知道我可以使用Gson的InstanceCreator解决这个问题.但有没有办法创建默认的构造函数?
更新
我发现自己的代码存在问题.我在用
gson.fromJson(new String(data), InterfaceName.class);
Run Code Online (Sandbox Code Playgroud)
代替
gson.fromJson(new String(data), ClassName.class);
Run Code Online (Sandbox Code Playgroud)
因此,即使子类具有默认构造函数,反序列化代码也是不正确的.但是默认构造函数的问题仍然存在.
我不能完全围绕Kademlia DHT的加入过程.我在网上看过一些教程和演示文稿,但它们似乎都以相同的方式说出来,并且所有psedo代码等在大多数情况下都是相同的(实际复制/粘贴).
有人可以高度重视这个吗?
我有一个接口,我想在其中提供默认方法来序列化继承的类。我使用一个JsonSerializer<T>类来进行序列化。
该方法如下所示:
public interface A
{
public default String write()
{
new JsonSerializer</*Inherited class type*/>();
// I've tried new JsonSerializer<this.getClass()>(); - Doesn't work
}
}
public class AX implements A
{
}
Run Code Online (Sandbox Code Playgroud)
所以当我实例化AX时,我想使用write方法来序列化AX
AX inst = new AX();
String instSerialized = inst.write();
Run Code Online (Sandbox Code Playgroud)
我需要将 AX 的类型传递给 A 中的 write 方法。这可能吗?
我在下面有两个版本的自旋锁.第一个使用默认值memory_order_cst,而后者使用memory_order_acquire/memory_order_release.由于后者更放松,我希望它有更好的表现.但似乎并非如此.
class SimpleSpinLock
{
public:
inline SimpleSpinLock(): mFlag(ATOMIC_FLAG_INIT) {}
inline void lock()
{
int backoff = 0;
while (mFlag.test_and_set()) { DoWaitBackoff(backoff); }
}
inline void unlock()
{
mFlag.clear();
}
private:
std::atomic_flag mFlag = ATOMIC_FLAG_INIT;
};
class SimpleSpinLock2
{
public:
inline SimpleSpinLock2(): mFlag(ATOMIC_FLAG_INIT) {}
inline void lock()
{
int backoff = 0;
while (mFlag.test_and_set(std::memory_order_acquire)) { DoWaitBackoff(backoff); }
}
inline void unlock()
{
mFlag.clear(std::memory_order_release);
}
private:
std::atomic_flag mFlag = ATOMIC_FLAG_INIT;
};
const int NUM_THREADS = 8;
const int NUM_ITERS = 5000000;
const …Run Code Online (Sandbox Code Playgroud) 我有一个压缩和解压缩字节数组的类;
public class Compressor
{
public static byte[] compress(final byte[] input) throws IOException
{
try (ByteArrayOutputStream bout = new ByteArrayOutputStream();
GZIPOutputStream gzipper = new GZIPOutputStream(bout))
{
gzipper.write(input, 0, input.length);
gzipper.close();
return bout.toByteArray();
}
}
public static byte[] decompress(final byte[] input) throws IOException
{
try (ByteArrayInputStream bin = new ByteArrayInputStream(input);
GZIPInputStream gzipper = new GZIPInputStream(bin))
{
// Not sure where to go here
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何解压缩输入并返回字节数组?
注意:由于字符编码问题,我不想对字符串进行任何转换.
我目前正在构建一个与更大的应用程序(Zend 1.x)一起工作的应用程序(使用 Laravel)。
我使用 Laravel Passport 进行 API 身份验证。我需要将 Laravel Passport 默认哈希机制更改为 Zend 哈希才能进行身份验证。
有人可以向我指出一个 API 或我需要重写才能运行它的东西吗?我不想编辑核心 Laravel Passport 代码。
我已经看到了创建自定义用户提供程序和修改validateCredentials()方法的建议,但这些都是针对核心 Laravel 的。
我已经在 User 类中使用 findForPassport 方法来覆盖用户名字段。
public function findForPassport($username)
{
return $this->where('email', $username)->first();
}
Run Code Online (Sandbox Code Playgroud) 嗨,我对OOP有点新手,我只是有一个简单的问题:说我在一个声明为类的类中有一个函数
class House
{
public static function hasAlcohol()
{
// Do Something
}
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以称之为
House::hasAlcohol()
Run Code Online (Sandbox Code Playgroud)
但是,我还想知道它是否可以使用编码标准和PHP,如果从一个房子的实例调用hasAlcohol()是没有错误的(我试过它并且没有错误),例如
$house = new House();
$house->hasAlcohol();
Run Code Online (Sandbox Code Playgroud) 我最近被介绍过方法链,我不确定我在这里做的是非法的,或者我做错了.我有一个数据库类,如:
class Database
{
private $connection;
private $resultset, $last_query, $current_row;
function __construct()
{
$this->connect();
}
public function connect()
{
// Connect to the database
}
public function query($query)
{
$this->last_query = $query;
$this->resultset = mysql_query($query, $this->connection);
}
public function fetchObject()
{
$this->current_row = mysql_fetch_object($this->resultset);
return $this->current_row;
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用它像:
$db->query("SELECT * FROM users WHERE name='JimmyP'")->fetchObject();
Run Code Online (Sandbox Code Playgroud)
我也试过了
$db->fetchObject()->query("SELECT * FROM users WHERE name='JimmyP'");
Run Code Online (Sandbox Code Playgroud)
但我得到错误:"在非对象上调用成员函数fetchObject()"
有人可以向我解释我在这里做错了什么,因为它与使用方法链接有关.谢谢.
java ×4
php ×3
algorithm ×2
generics ×2
angular ×1
c++ ×1
c++11 ×1
compression ×1
dht ×1
gzip ×1
java-8 ×1
jersey ×1
jersey-2.0 ×1
kademlia ×1
laravel-5 ×1
laravel-5.4 ×1
lock-free ×1
minesweeper ×1
p2p ×1
performance ×1
quicksort ×1
rest ×1
sorting ×1
typescript ×1