70ptsWA#1#4#5求调
查看原帖
70ptsWA#1#4#5求调
467324
LuoMuxiaoxiao楼主2024/8/15 15:52
#include<bits/stdc++.h>
using namespace std;

const int dx[4] = {0, 0, 1, -1};
const int dy[4] = {1, -1, 0, 0};
const int N = 505;

/*struct debug
{
	int x, int y;
};*/

struct Node
{
	int x, y;
	//(x, y) -> (l, r)
	//debug
	int idx;
};

int min(int a, int b)
{
	return (a > b) ? b : a;
}
int max(int a, int b)
{
	return (a > b) ? a : b;
}

bool vis[N][N], vis1[N], vis2[N], con = 1;
int n, m, a[N][N], ans = 0, de;
Node lr[N];

void bfs(int x, int y)
{
	//printf("Try to start search(%d, %d)\n", x, y);
	Node tep, f;
	queue<Node> q1;
	tep.x = x; tep.y = y;
	q1.push(tep);
	int maxx = 0, minn = INT_MAX;
	
	while(!q1.empty()) {
		f = q1.front();
		q1.pop();
		//printf("	(%d, %d) arrive (%d, %d)\n", x, y, f.x, f.y);
		
		//if(vis[f.x][f.y]) {
		//	continue;
		//}
		if(f.x == 0) {
			vis1[f.y] = true;
			//printf("(%d, %d) arrive (%d, %d)\n", x, y, f.x, f.y);
		}
		if(f.x == n-1) {
			printf("(%d, %d) arrive (%d, %d) update(%d,%d)", x, y, f.x, f.y, minn, maxx);
			minn = min(minn, f.y);
			maxx = max(maxx, f.y);
			vis2[f.y] = true;
			printf("to(%d,%d)\n", minn, maxx);
		}
		
		vis[f.x][f.y] = true;
		for(int i = 0; i < 4; i++) {
			if(f.x+dx[i] == n-1 && f.y+dy[i] == 6) {
				printf("(%d, %d)(%d, %d)(%d, %d), %d %d %d %d %d %d\n", a[f.x][f.y], a[f.x+dx[i]][f.y+dy[i]], f.x, f.y, f.x+dx[i], f.y+dy[i], 0 <= f.x+dx[i], f.x+dx[i] < n, 0 <= f.y+dy[i], f.y+dy[i] < m, !vis[f.x+dx[i]][f.y+dy[i]], a[f.x][f.y] > a[f.x+dx[i]][f.y+dy[i]]);
			}
			if(0 <= f.x+dx[i] && f.x+dx[i] < n && 0 <= f.y+dy[i] && f.y+dy[i] < m && !vis[f.x+dx[i]][f.y+dy[i]] && a[f.x][f.y] > a[f.x+dx[i]][f.y+dy[i]]) {
				tep.x = f.x+dx[i]; tep.y = f.y+dy[i];
				vis[tep.x][tep.y] = true;
				q1.push(tep);
			}
		}
	}
	if(minn == INT_MAX) {
		lr[y].x = -1; lr[y].y = -1;
		
		lr[y].idx = y;
	}
	else {
		for(int i = maxx; i <= minn; i++) {
			if(!vis[n-1][i]) {
				//printf("Ops change con [%d, %d](%d, %d)\n", minn, maxx, x, y);
				con = 0;
				return;
			}
		}
		lr[y].x = minn; lr[y].y = maxx; lr[y].idx = y;
	}
	for(int i = 0; i < n; i++) {
		for(int j = 0; j < m; j++) {
			vis[i][j] = false;
		}
	}
	
}

bool cmp(Node a, Node b)
{
	return (a.x == b.x) ? (a.y < b.y) : (a.x < b.x);
}

int main()
{
	scanf("%d%d", &n, &m);
	for(int i = 0; i < n; i++) {
		for(int j = 0; j < m; j++) {
			scanf("%d", &a[i][j]);
		}
	}
	//a[0][0~m-1] 临水 
	//a[n-1][0~m-1]临沙
	 
	for(int i = 0; i < m; i++) {
		if(!vis1[i]) {
			bfs(0, i);
		}
		else if(vis1[i]) {
			lr[i].x = -1; lr[i].y = -1;
			
			lr[i].idx = i;
		}
	}
	
	
	for(int i = 0; i < m; i++) {
		ans += !vis2[i];
	}
	
	//printf("ans:%d\n", ans);
	
	if(con && !ans) {
		sort(lr, lr+m, cmp);
		int iter = 0, r = -1, maxx = 0;
		while(lr[iter].x < 0) iter++;
		for(int i = 0; i < m; i++) {
			for(int j = 0; j < m; j++) {
				if(lr[j].x>r+1) break;
				if(lr[j].y > maxx) de = j;
				maxx = max(maxx, lr[j].y);
			}
			r = maxx;
			//printf("Round%d, (%d,%d,%d)", i, lr[de].x, lr[de].y, lr[de].idx);
			ans++;
			if(r >= m-1) {
				printf("1\n%d\n", ans);
				
				for(int i = 0; i < m; i++) {
					printf("(%d, %d, %d)\n", lr[i].x, lr[i].y, lr[i].idx);
				}
				for(int i = 0; i < m; i++) {
					printf("%d ", vis1[i]);
				}
				printf("\n");
				for(int i = 0; i < m; i++) {
					printf("%d ", vis2[i]);
				}
				printf("\n");
				
				return 0;
			}
		}
	}
	else {
		printf("0\n%d\n", m-ans);
	}
	
	
	/*for(int i = 0; i < m; i++) {
		printf("(%d, %d, %d)\n", lr[i].x, lr[i].y, lr[i].idx);
	}
	for(int i = 0; i < m; i++) {
		printf("%d ", vis1[i]);
	}
	printf("\n");
	for(int i = 0; i < m; i++) {
		printf("%d ", vis2[i]);
	}
	printf("\n");*/
	
	return 0;
 } 

附有#1的样例图 输出0 7

输入为:

2024/8/15 15:52
加载中...