#include <iostream>
#include <istream>
#include <sstream>
#include <vector>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <cstring>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <numeric>
#include <chrono>
#include <ctime>
#include <cmath>
#include <cctype>
#include <string>
#include <cstdio>
#include <iomanip>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <iterator>
using namespace std;
const string strs = "*0123456789";
struct Input{
string data[3];
bool operator<(const Input&in)const{
for (int i = 0; i < 3; i++){
if (data[i] != in.data[i]) return data[i] < in.data[i];
}
return false;
}
friend ostream& operator<<(ostream &out,const Input&in){
out << in.data[0] << " " << in.data[1] << " " << in.data[2];
return out;
}
void Clear(){
for (int i = 0; i < 3; i++) data[i] = "";
}
};
map<Input, int> mmp;
Input ans;
bool isok;
void dfs(Input &input, int cur,int pos){
if (cur >= 3) return;
int len = input.data[cur].size();
int nc = cur + (pos + 1) / len, np = (pos + 1) % len;
dfs(input, nc, np);
int back = input.data[cur][pos];
input.data[cur][pos] = '*';
mmp[input]++;
dfs(input, nc, np);
input.data[cur][pos] = back;
}
void Init()
{
Input input;
for (int i = 0; i < 100; i++){
for (int j = 0; j < 100; j++){
input.data[0] = to_string(i);
input.data[1] = to_string(j);
input.data[2] = to_string(i*j);
dfs(input, 0,0);
mmp[input]++;
}
}
}
bool IsFind(Input & input){
return mmp[input] == 1;
}
void dfs1(Input &input,int depth,int cur,int pos){
if (isok && ans < input) return;
if (IsFind(input)){
if (!isok) ans = input;
else
ans = min(ans, input);
isok = true;
return ;
}
if (depth == 0 || cur >= 3) return ;
int back = input.data[cur][pos],len = input.data[cur].size();
int nc = cur + (pos + 1) / len, np = (pos + 1) % len;
for (int i = 0; i < strs.size(); i++){
int c = strs[i];
if ((c == '0' && pos == 0)) continue;
input.data[cur][pos] = c;
dfs1(input, depth - (c != back), nc, np);
input.data[cur][pos] = back;
}
}
int main()
{
Init();
Input input;
int kCase = 0;
while (cin >> input.data[0] && input.data[0] != "0"){
cin >> input.data[1] >> input.data[2];
isok = false;
ans.Clear();
for (int i = 0; i < 9; i++){
dfs1(input, i, 0, 0);
if (isok)break;
}
cout << "Case " << ++kCase << ": " << ans <<endl;
}
return 0;
}
习题7-8(uva-12107)
最新推荐文章于 2021-07-01 11:56:40 发布
266

被折叠的 条评论
为什么被折叠?



