重金悬赏求条(5r/好康的图10张
  • 板块灌水区
  • 楼主BK小鹿
  • 当前回复165
  • 已保存回复170
  • 发布时间2024/9/3 10:13
  • 上次更新2024/9/3 11:46:23
查看原帖
重金悬赏求条(5r/好康的图10张
1345783
BK小鹿楼主2024/9/3 10:13

rt,奖励二选一。

注意,我不要AC代码或者GPT,你就从我代码上改或者告诉我哪错了,奖励只有一份

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int N = 15;

char g[N][N];
int ans[N][N], can[N][N][N];

char read(){
char c=getchar();
while(c<'0'||c>'9'&&c!='?'){
c=getchar();
}
return c;
}

int get1(int op)
{
	if ((op % 3) == 1) return 1;
	if ((op % 3) == 2) return 4;
	if ((op % 3) == 0) return 7;
}
int get(int x, int y)
{
	int cnt = (y + 2) / 3, cnt1 = (x + 2) / 3;
	/*if (cnt1 == 1) return cnt;
	if (cnt1 == 2) return 3 + cnt;
	if (cnt1 == 3) return 6 + cnt;*/
	return cnt*3-3+cnt1;
}

void calc(int x, int y)
{
	for (int i = 1; i <= 9; i ++ ) if (1 <= (g[x][i] - '0') && (g[x][i] - '0') <= 9 && can[x][y][g[x][i] - '0']) can[x][y][g[x][i] - '0'] = 0,can[x][y][0]--;
	for (int i = 1; i <= 9; i ++ ) if (1 <= (g[i][y] - '0') && (g[i][y] - '0') <= 9 && can[x][y][g[i][y] - '0']) can[x][y][g[i][y] - '0'] = 0,can[x][y][0]--;
	
	int op = get(x, y);
	for (int i = ((op + 2) / 3 - 1) * 3 + 1; i <= ((op + 2) / 3 - 1) * 3 + 3; i ++ )
	  for (int j = get1(op); j <= get1(op) + 2; j ++ )
	    if (1 <= (g[i][j] - '0') && (g[i][j] - '0') <= 9 && can[x][y][g[i][j] - '0']) can[x][y][g[i][j] - '0'] = 0,can[x][y][0]--;
}

void dfs(int left)
{
	if (left == 0)
	{
		for (int i = 1; i <= 9; i ++ )
		{
			for (int j = 1; j <= 9; j ++ ) printf("%d", ans[i][j]);
			puts("");
		}
		exit(0);
	}
	
	int minn = 9, x = -1, y = -1;
	for (int i = 1; i <= 9; i ++ )
	  for (int j = 1; j <= 9; j ++ )
	  {
	  	if ((1 <= (g[i][j] - '0') && (g[i][j] - '0') <= 9) || ans[i][j]) continue;
	  	int cnt = can[i][j][0];
	  	if (cnt < minn && cnt != 0)
	  	{
		  	minn = cnt;
		  	x = i, y = j;
		}
	  }
	
	if ((x == -1 && y == -1)) return;
	
	int num;
	for (int k = 1; k <= 9; k ++ ) 
	  if (can[x][y][k])
	  {
	  	bool fl[N][N];
	  	memset(fl, 0, sizeof fl);
	  	    num = k;
	  		for (int i = 1; i <= 9; i ++ )
	  		{
	  			if (can[x][i][num])can[x][i][num]=0,can[x][i][0]--,fl[x][i]=1;
			  	if (can[i][y][num])can[i][y][num]=0,can[i][y][0]--,fl[i][y]=1;
			  }
		  	int op = get(x, y);
		  	for (int i = ((op + 2) / 3 - 1) * 3 + 1; i <= ((op + 2) / 3 - 1) * 3 + 3; i ++ )
		  	  for (int j = get1(op); j <= get1(op) + 2; j ++ )
		  	    if(can[i][j][num]) can[i][j][num] = 0,can[i][j][0]--,fl[i][j]=1;	
		  	g[x][y] = 48+num;
		  	ans[x][y] = num;
		  	dfs(left - 1);
		  		  	
			  			 		for (int i = 1; i <= 9; i ++ )
			  			  		{
			  			  			for (int j = 1; j <= 9; j ++ ) printf("%d", ans[i][j]);
			  			  			puts("");
			  			  		}
			  			  		puts("");
		  	g[x][y] = '?';
		  	ans[x][y] = 0;
		  	
			 /* 		for (int i = 1; i <= 9; i ++ )
			  		{
			  			for (int j = 1; j <= 9; j ++ ) printf("%d", ans[i][j]);
			  			puts("");
			  		}
			  		puts("");*/
	  		for (int i = 1; i <= 9; i ++ )
	  		{
	  			if (fl[x][i])can[x][i][num]=1,can[x][i][0]++;
			  	if (fl[i][y])can[i][y][num]=1,can[i][y][0]++;
			  }
		  	op = get(x, y);
		  	for (int i = ((op + 2) / 3 - 1) * 3 + 1; i <= ((op + 2) / 3 - 1) * 3 + 3; i ++ )
		  	  for (int j = get1(op); j <= get1(op) + 2; j ++ )
		  	    if(fl[i][j]) can[i][j][num] = 1,can[i][j][0]++;			  	
	  }

}


int main()
{
	for (int i = 1; i <= 9; i ++ )
		for (int j = 1; j <= 9; j ++ )
		for (int k = 1; k < 10; k ++ )
		    can[i][j][k] = 1;
	int num = 0;
	for (int i = 1; i <= 9; i ++ )
	  for (int j = 1; j <= 9; j ++ )
	    g[i][j] = read(),can[i][j][0] = 9;
	
	for (int i = 1; i <= 9; i ++ )
	  for (int j = 1; j <= 9; j ++ )
	    if (g[i][j] == '?') calc(i, j), num ++ ;
	    else ans[i][j] = g[i][j] - '0';
	
	dfs(num);
	return 0;
}
2024/9/3 10:13
加载中...