山东省第三届省赛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;}
- 山东省第三届省赛D题
- HEX 山东省第八届省赛D题
- 山东省第三届省赛 (Pixel density)
- 山东省第三届省赛(Mine Number)
- Sdut 2164 Binomial Coeffcients (组合数学) (山东省ACM第二届省赛 D 题)
- Sdut 2108 Alice and Bob(数学题)(山东省ACM第四届省赛D题)
- HEX----组合数+逆元+思维 山东省第八届省赛D题
- hatuoj 1300 HEX----组合数+逆元+思维 山东省第八届省赛D题
- 2017山东省-D-Hex
- 山东省2012年第三届省赛之Fruit Ninja II
- 山东省acm省赛 D题Swiss-system tournetment
- HEX SDUT 3896 17年山东省赛D题
- 2017山东省赛D题(SDUT3896逆元法求组合数)
- 山东省第八届acm省赛D题 HEX
- 山东省第六届省赛K题
- 山东省第七届省赛L题
- 2017 ACM山东省赛 D
- 山东省第三届ACM省赛
- hdu2570
- 水沟问题
- 国内首款次世代3D引擎“黑火”完全解析
- 在Windows上建立OpenCV2.4.0开发环境
- poj2449 Remmarguts' Date
- 山东省第三届省赛D题
- 不同网段的socket通信 以及winPcap vs2005设置
- ABAP编程中常用的小知识
- zeroconf研究笔记(1) ——zeroconf初步认识
- C语言程序的内存布局(四)C语言程序的运行
- 省赛热身赛C
- HDU 2037 今年暑假不AC (贪心入门)
- shell编程基础
- 卸载Sqlserver完美卸载