Problem Description
Slitherlink is a type of logic puzzle made popular by Nikoli, the same Japanese puzzle company that has made Sudoku popular the world over. Like
most good logic puzzles, it has a set of very basic rules that can nonetheless result in devilishly difficult (and delightful!) puzzling experiences.

The rules of Slitherlink are as follows:

A Slitherlink board is made up of a lattice of dots; in this problem, it will be a regular rectangular lattice.
Some of the boxes (or cells) defined by the lattice have numbers within them; with a regular rectangular lattice, the numbers will be between 0
and 3 inclusive.
The goal of a Slitherlink puzzle is to connect adjacent dots (horizontally or vertically, like the sides of boxes) so that there is a single loop that
never crosses itself, with no line segments that are not part of the loop (no "dangling" segments or other, separate loops) such that every cell
that has a number has exactly that many sides as segments of the loop.

Given a supposedly solved Slitherlink puzzle, your task will be to determine whether or not it is indeed legitimately solved.

Input
Input to this problem will begin with a line containing a single integer N (1 ≤ N ≤ 100) indicating the number of data sets. Each data set consists of
the following components:

A line containing two integers H, W (1 ≤ H,W ≤ 20) representing the height and width of the Slitherlink puzzle by the number of cells (not
dots!) per edge;
A series of 2H + 1 lines representing the Slitherlink puzzle, using the following non-whitespace characters:
0, 1, 2, 3, ?: The numbers written inside a given cell. A ? represents an empty cell, as in the example graphic above.
#: A dot in the lattice.
-, |: A horizontal or vertical line segment.
.: An empty adjacency between two dots in the lattice.

Note that all Slitherlink puzzles will be fully represented; that is, there is no internal whitespace on a given line to represent empty cells or

Output
For each data set, print "VALID" if the solution is a valid solution to the given Slitherlink, or "INVALID" if the solution is not valid.

Sample Input
2
5 5
#-#-#-#-#-#
|?.?.?.1.3|
#.#-#-#.#-#
|?|?.?|?|?.
#-#.#.#.#-#
.2.0.2|?.?|
#-#.#-#.#-#
|?|3|?.?|2.
#.#-#.#-#.#
|?.?.2|?.0.
#-#-#-#.#.#
5 5
#-#-#-#-#-#
|?|?.?.1.3|
#.#-#-#.#-#
|?|?.?|?|?.
#-#.#.#.#-#
.2.0.2|?.?|
#-#.#-#.#-#
|?|3|?.?|2.
#.#-#.#-#.#
|?.?.2|?.0.
#-#-#-#-#.#

Sample Output
VALID
INVALID

Java学习的正确打开方式

Elastic：菜鸟上手指南

Java知识体系最强总结(2020版)

Windows可谓是大多数人的生产力工具，集娱乐办公于一体，虽然在程序员这个群体中都说苹果是信仰，但是大部分不都是从Windows过来的，而且现在依然有很多的程序员用Windows。 所以，今天我就把我私藏的Windows必装的软件分享给大家，如果有一个你没有用过甚至没有听过，那你就赚了......，这可都是提升你幸福感的高效率生产力工具哦！ 走起！...... NO、1 ScreenToGif 屏幕，摄像头和

CPU对每个程序员来说，是个既熟悉又陌生的东西？ 如果你只知道CPU是中央处理器的话，那可能对你并没有什么用，那么作为程序员的我们，必须要搞懂的就是CPU这家伙是如何运行的，尤其要搞懂它里面的寄存器是怎么一回事，因为这将让你从底层明白程序的运行机制。 随我一起，来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说，我们首先就要搞明白它是怎么回事，也就是它的内部构造，当然，CPU那么牛的一个东
【综合篇】浏览器的工作原理：浏览器幕后揭秘
web（给达达前端加星标，提升前端技能） 了解浏览器是如何工作的，能够让你站在更高的角度去理解前端 浏览器的发展历程的三大路线，第一是应用程序web化，第二是web应用移动化，第三是web操作系统化。是不是有点不直白。 应用程序web化就是随着现在技术的发展，现在越来越多的应用转向了浏览器与服务器，就是B/S架构；web应用移动化，就是在移动设备应用，什么是移动设备呢。 “移动设备：

2020年1月17日，国家统计局发布了2019年国民经济报告，报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏，但是很多人并没有看到我国复杂的人口问题：老龄化、男女比例失衡、生育率下降、人口红利下降等。 今天我们就来分析一下我们国家的人口数据吧！ 更多有趣分析教程，扫描下方二维码关注vx公号「裸睡的猪」 即可查看！ 一、背景 1.人口突破14亿 2020年1月17日，国家统计局发布

B 站上有哪些很好的学习资源?

CSS操作之你不得不知的一些小技巧（一）ヾ(Ő∀Ő๑)ﾉ太棒了！！

Firebug 的年代，我是火狐（Mozilla Firefox）浏览器的死忠；但后来不知道为什么，该插件停止了开发，导致我不得不寻求一个新的网页开发工具。那段时间，不少人开始推荐 Chrome 浏览器，我想那就试试吧，期初我觉得用起来很别扭，毕竟我不是一个“喜新厌旧”的人。但用的次数越来越多，也就习惯了。 Chrome 浏览器有一个好处，就是插件极其丰富，只有你想不到的，没有你找不到的，这恐怕是...

Java程序员都需要懂的「反射」

Java第二周学习
Java第二周学习 1. 数组 1.1 定义数组格式 数据类型[] 数组名 = new 数据类型[容量]; int[] arr = new int[10]; 赋值左侧 数据类型: 告知编译器，当前数组中能够保存的数据类型到底是什么？并且在确定数据类型之后，整个数组中保存的数据类型无法修改！！！ []: 告知编译器这里定义的是一个数组类型数据。 明确告知编译器，数组名是一个【引用数据类型...

Java基础知识面试题（2020最新版）

Spring面试题（2020最新版）

C语言写个贪吃蛇游戏

7年加工作经验的程序员，从大厂跳槽出来，遭遇了什么？

Python3怎么处理Excel中的数据（xlrd、xlwt的使用方法）

python --图像处理基础