比赛的时候看错题目,它是个伪扫雷,数字只代表周五5个位置的雷数。
题意:输入扫雷大小n,m,n*m数字矩阵,输出雷的分布(只有唯一解)
解法:简单搜索
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int n,m,flag;
int move[5][2]={0,0,0,1,0,-1,1,0,-1,0};
char a[25][25],mine[25][25],mine2[25][25];
bool check(int x,int y){
if(x>=0 && y>=0 && x<n && y<m)return true;
return false;
}
int getsum(int x,int y){
int tx,ty,i,sum=0;
for(int i=0;i<5;i++){
tx=x+move[i][0];
ty=y+move[i][1];
if(check(tx,ty) && mine[tx][ty]=='*')
sum++;
}
return sum;
}
void dfs(int x,int y){
if(flag)return;
if(x==n){
flag=1;
memcpy(mine2,mine,sizeof(mine));
return;
}
int i, tx, ty, sum=a[x][y]-'0', s=getsum(x, y);
if(sum==s){
if(y==m-1)dfs(x+1,0);
else dfs(x,y+1);
return;
}
if(x==0 && y==0){
if(sum==0){
if(y==m-1)dfs(x+1,0);
else dfs(x,y+1);
}
if(sum==1){
mine[0][0]='*';
if(y==m-1)dfs(x+1,0);
else dfs(x,y+1);
mine[0][0]='.';
if(m>1){
mine[0][1]='*';
if(y==m-1)dfs(x+1,0);
else dfs(x,y+1);
mine[0][1]='.';
}
if(n>1){
mine[1][0]='*';
if(y==m-1)dfs(x+1,0);
else dfs(x,y+1);
mine[1][0]='.';
}
}
else if(sum==2){
if(m>1){
mine[0][0]='*';
mine[0][1]='*';
if(y==m-1)dfs(x+1,0);
else dfs(x,y+1);
mine[0][0]='.';
mine[0][1]='.';}
if(n>1){
mine[0][0]='*';mine[1][0]='*';
if(y==m-1)dfs(x+1,0);else dfs(x,y+1);
mine[0][0]='.';mine[1][0]='.';}
if(n>1&&m>1){
mine[0][1]='*';
mine[1][0]='*';
if(y==m-1)dfs(x+1,0);
else dfs(x,y+1);
mine[0][1]='.';
mine[1][0]='.';}
}
else if(sum==3){
if(n>1&&m>1){
mine[0][1]='*';mine[0][0]='*';mine[1][0]='*';
if(y==m-1)dfs(x+1, 0);else dfs(x, y+1);
mine[0][1]='.';mine[0][0]='.';mine[1][0]='.';}
}
else return;
}
else if(x==0&&y>0){
if(s>sum||s<sum-2)return;
if(sum-s==2){
if(y==m-1)return ;
mine[x][y+1]='*';mine[x+1][y]='*';
if(y==m-1)dfs(x+1, 0);else dfs(x, y+1);
mine[x][y+1]='.';mine[x+1][y]='.';
}
else if(sum-s==1){
if(y<m-1){
mine[x][y+1]='*';
if(y==m-1)dfs(x+1, 0);else dfs(x, y+1);
mine[x][y+1]='.';}
if(x<n-1){
mine[x+1][y]='*';
if(y==m-1)dfs(x+1, 0);else dfs(x, y+1);
mine[x+1][y]='.';
}
}
else if(sum-s==0){
if(y==m-1)dfs(x+1, 0);else dfs(x, y+1);
}
}
else if(x>0&&y==0){
if(s>sum||s<sum-1)return;
if(sum-s==1){
if(x<n-1){
mine[x+1][y]='*';
if(y==m-1)dfs(x+1, 0);else dfs(x, y+1);
mine[x+1][y]='.';
}
}
else if(sum-s==0){
if(y==m-1)dfs(x+1, 0);else dfs(x, y+1);
}
}
else if(x==n-1){
if(s!=sum)return ;
}
else {
if(s>sum||s<sum-1)return ;
if(sum-s==1){
if(x<n-1){
mine[x+1][y]='*';
if(y==m-1)dfs(x+1, 0);else dfs(x, y+1);
mine[x+1][y]='.';}
}
else if(sum-s==0){
if(y==m-1)dfs(x+1, 0);else dfs(x, y+1);
}
}
return ;
}
int main(){
//freopen("1.txt", "r", stdin);
int T, i, j, cas=1;
scanf("%d", &T);
while(T--){
flag=0;
scanf("%d%d", &n, &m);
for(i=0; i<n; i++)
scanf("%s", &a[i]);
printf("Case %d:\n", cas++);
for(i=0; i<n; i++){
for(j=0; j<m; j++)
mine[i][j]='.';
mine[i][j]='\0';
}
dfs(0, 0);
for(i=0; i<n; i++)
printf("%s\n", mine2[i]);
}
return 0;
}