山东省第三届省赛D题

来源:互联网 发布:云计算概念股龙头股票 编辑:程序博客网 时间:2024/06/10 06:37

比赛的时候看错题目,它是个伪扫雷,数字只代表周五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;}


 

原创粉丝点击