用C++程序解决星星碰问题
04/291 浏览综合
#include <iostream>
using namespace std;
int map[100][100];
int ans[100][100];
int n,m;
bool check_map(){
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(map[i][j]==1)return false;
return true;
}
void change_light(int x,int y){
if(map[x][y]>=0)map[x][y]^=1;
if(map[x+1][y]>=0)map[x+1][y]^=1;
if(map[x][y+1]>=0)map[x][y+1]^=1;
if(map[x-1][y]>=0)map[x-1][y]^=1;
if(map[x][y-1]>=0)map[x][y-1]^=1;
}
bool dfs(int x,int y){
if(x>n){
return check_map();
}
if(y>m){
return dfs(x+1,1);
}
if(map[x][y]==-1)return dfs(x,y+1);
// test 0:
ans[x][y]=0;
bool ans2 = dfs(x,y+1);
if(ans2)return true;
// test 1:
ans[x][y]=1;
change_light(x,y);
ans2 = dfs(x,y+1);
if(ans2)return true;
change_light(x,y);
ans[x][y]=0;
return false;
}
int main(){
cin>>n>>m;
char c;
for(int i=0;i<=n+1;i++)for(int j=0;j<=m+1;j++)map[i][j]=-1;
for(int i=1;i<=n;i++){
string str;
cin>>str;
for(int j=1;j<=m;j++){
c= str[j-1];
if(c=='#')map[i][j]=-1;
if(c=='*')map[i][j]=1;
if(c=='.')map[i][j]=0;
}
}
dfs(1,1);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(map[i][j]<0)cout<<"#";
else cout<<ans[i][j];
}
cout<<endl;
}
}
先输入行数和列数
然后输入地图,点表示空格,*表示星星,# 表示墙壁。注意地图外的格子需要全部标成墙壁。
然后程序会输出一个相同大小的包含0,1和# 的answer,表示解法。0表示该格子需要按偶数遍,如果没有星星可以把相邻的按一下然后这个点按两次。1表示该格子需要按奇数遍。
实测任何游戏中的题都可以用该程序间接解决