题目链接:点击打开链接

最短路。


#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int N = 205;
const int dx[] = {-1, 1, 0, 0};
const int dy[] = {0, 0, 1, -1};

int a[N][N], x[N*N], y[N*N];
bool vis[N][N];
queue<pair<int, int> > q;
int main() {
	int n, m;
	while(~scanf("%d%d", &n, &m)) {
		memset(vis, 0, sizeof vis);
		while(q.size()) q.pop();

		for(int i = 0; i < n; i ++) {
			for(int j = 0; j < m; j ++) {
				scanf("%d", &a[i][j]);
				if(a[i][j] == 1) {
					q.push(make_pair(i, j));
					vis[i][j] = 1;
				}
			}
		}
	//	printf("%d\n", q.size());
		int top = 0;
		pair<int, int> t;
		while(q.size()) {
			t = q.front(); q.pop();
			int xx = t.first, yy = t.second;
			a[xx][yy] --;
			x[++top] = xx;
			y[top] = yy;
			if(a[xx][yy] < 0) {
				top = -2;
				break;
			}

			for(int i = 0; i < 4; i ++) {
				int nx = xx + dx[i], ny = yy + dy[i];
				if(nx < 0 || nx >= n || ny < 0 || ny >= m) continue;

				if(a[nx][ny] > 0) a[nx][ny] --;

				if(a[nx][ny] == 1 && !vis[nx][ny]) q.push(make_pair(nx, ny));
				else if(a[nx][ny] < 0) {
					top = -2;
					break;
				}
			}
			if(top == -2) break;
		}
		//printf("%d\n", top);
		for(int i = 0; i < n; i ++) {
			for(int j = 0; j < m; j ++) {
				if(a[i][j] > 0) {
					top = -2;
					break;
				}
			}
		}
		if(top == -2) puts("No solution");
		else {
			for(int i = top; i > 0; i --) {
				printf("%d %d\n", x[i] + 1, y[i] + 1);
			}
		}
	}
	return 0;
}