G - Mad Veterinarian

/*
	UVALive	6178
	题目和hdu4490一样,貌似数据强度不是一个档次。
	或者spj有问题?= =据说以前AC过的代码现在不能AC了?
	囧写了好长时间,跪了20发,感觉状态上界可以用数学求?
	= =数据范围也不告诉。。这样真的好么?
	想不通了....水过了hdu...
	构造了一个简单估价函数。
	唯一需要注意的一点是为个数零的动物不可能继续转换。(也就是不可能找别人借,然后填上)
*/
//#pragma comment(linker, "/STACK:167772160")
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <set>
#include <map>
#include <vector>
#include <queue>
#include <ctime>
#include <cmath>
#include <cassert>
//#include <fstream>
#include <stack>
#include <cctype>
#define MP make_pair
#define PB push_back
#define SZ(x) (int)x.size()
#define INF 1<<29
#define pii pair<int,int>
#define pll pair<LL,LL>
#define vi vector<int>
#define L(x) x<<1
#define R(x) x<<1|1
#if(_WIN32||__WIN32__)
    #define LL __int64
    #define ll I64
#else
    #define LL long long
#endif
//#define Local

using namespace std;

map<vi,int>Map;
int dir[4][4],Max_dir[4];
vi goal;
const string s1="ABC";
const string s2="abc";
struct Node
{
	vi statu;
	string path;
	double A_star;
	void h()
	{
		double ret=0;
		for(int i=0;i<SZ(statu);i++)
		{
			if(Max_dir[i]>0)
				ret+=1.0*abs(goal[i]-statu[i])/Max_dir[i];
			else
				ret+=abs(goal[i]-statu[i]);
		}
		A_star=ret+Map[statu];
	}
	bool friend operator <(const Node a,const Node b){
		return a.A_star>b.A_star;
	}
};

int BFS(vi st,vi ed,string& path)
{
	Map.clear();
	Node now=(Node){st,""};
	now.h();
	priority_queue<Node>q;
	q.push(now);
	int count=0;
	while(!q.empty())
	{
		if(count++>=6000)
			return -1;
		now=q.top();q.pop();
		bool flag=false;
		for(int i=0;i<3;i++)
			if(now.statu[i]>50)
				flag=true;
		if(flag)
			continue;
		if(now.statu==ed)
		{
			path=now.path;
			return true;
		}
		for(int d=0;d<2;d++)
		{
			for(int i=0;i<3;i++)
			{
				Node next=now;
				if(d==0)
				{
					next.statu[i]-=1;
					if(next.statu[0]<0||next.statu[1]<0||next.statu[2]<0)
						continue;
					for(int k=0;k<3;k++)
						next.statu[k]+=dir[i][k];
					if(Map.count(next.statu))
						continue;
					Map[next.statu]=Map[now.statu]+1;
					next.path+=s1[i];
					next.h();
					q.push(next);
				}
				else{
					for(int k=0;k<3;k++)
						next.statu[k]-=dir[i][k];
					if(next.statu[0]<0||next.statu[1]<0||next.statu[2]<0)
						continue;					
					next.statu[i]+=1;
					if(Map.count(next.statu))
						continue;
					Map[next.statu]=Map[now.statu]+1;
					next.path+=s2[i];
					next.h();
					q.push(next);
				}
			}
		}
	}
	return -1;
}

int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		int Case,n;
		scanf("%d %d",&Case,&n);
		memset(Max_dir,0,sizeof(Max_dir));
		for(int i=0;i<3;i++)
			for(int j=0;j<3;j++)
			{
				scanf("%d",&dir[i][j]);
				Max_dir[j]=max(dir[i][j],Max_dir[j]);
			}
		printf("%d %d\n",Case,n);
		for(int i=1;i<=n;i++)
		{
			int __;
			scanf("%d",&__);
			vi st,ed;
			int x,y,z;
			scanf("%d %d %d",&x,&y,&z);
			st.PB(x),st.PB(y),st.PB(z);
			scanf("%d %d %d",&x,&y,&z);
			ed.PB(x),ed.PB(y),ed.PB(z);
			goal=ed;
			printf("%d ",__);
			string s;
			if(BFS(st,ed,s)==-1)
				puts("NO SOLUTION");
			else	
				cout<<Map[ed]<<" "<<s<<endl;
		}
	}
    return 0;
}

/*

2
1 2
0 1 0
1 1 1
1 1 0
1 0 1 1 0 1 1
2 1 0 0 2 0 0
2 2
0 3 4
0 0 5
0 0 3
2 2 0 0 0 0 4
1 2 0 0 0 0 5

1
1 2
0 1 0
1 0 1
0 0 2
1 1 1 4 2 0 0
2 2 0 0 0 0 2
*/

(Telephone Number Word Generator) Standard telephone keypads contain the digits 0 through 9. The numbers 2 through 9 each have three letters associated with them, as is indicated by the following table: Many people find it difficult to memorize phone numbers, so they use the correspondence between digits and letters to develop seven-letter words that correspond to their phone numbers. For example, a person whose telephone number is 686-2377 might use the correspondence indi- cated in the above table to develop the seven-letter word “NUMBERS.” Businesses frequently attempt to get telephone numbers that are easy for their clients to remember. If a business can advertise a simple word for its customers to dial, then no doubt the business will receive a few more calls. Each seven-letter word corresponds to exactly one seven-digit telephone number. The restaurant wishing to increase its take-home business could surely do so with the number 825-3688 (i.e., “TAKEOUT”). Each seven-digit phone number corresponds to many separate seven-letter words. Unfortunately, most of these represent unrecognizable juxtaposi- tions of letters. It’s possible, however, that the owner of a barber shop would be pleased to know that the shop’s telephone number, 424-7288, corresponds to “HAIRCUT.” A veterinarian with the phone number 738-2273 would be happy to know that the number corresponds to “PETCARE.” Write a C++ program that, given a seven-digit number, writes to a file every possible seven-letter word corresponding to that number. There are 2187 (3 to the seventh power) such words. Avoid phone numbers with the digits 0 and 1.
06-09
Sure, I can help you with that! Here's the C++ code to generate all possible seven-letter words for a given seven-digit phone number: ``` #include <iostream> #include <fstream> #include <string> using namespace std; // Function to generate all possible seven-letter words for a given phone number void generateWords(string number, string word, int index, ofstream& outfile) { // Base case: all digits have been processed if (index == number.size()) { outfile << word << endl; // write the word to the output file return; } // Generate all possible letters for the current digit string letters = ""; switch (number[index]) { case '2': letters = "ABC"; break; case '3': letters = "DEF"; break; case '4': letters = "GHI"; break; case '5': letters = "JKL"; break; case '6': letters = "MNO"; break; case '7': letters = "PQRS"; break; case '8': letters = "TUV"; break; case '9': letters = "WXYZ"; break; } // Recursively generate words for the remaining digits for (int i = 0; i < letters.size(); i++) { generateWords(number, word + letters[i], index + 1, outfile); } } int main() { string number; cout << "Enter a seven-digit phone number (no 0's or 1's): "; cin >> number; // Open an output file to write the generated words ofstream outfile("words.txt"); // Generate all possible seven-letter words generateWords(number, "", 0, outfile); // Close the output file outfile.close(); cout << "Done! Check the output file 'words.txt' for the generated words." << endl; return 0; } ``` To use this program, simply run it in a C++ compiler and enter a seven-digit phone number (without any 0's or 1's) when prompted. The program will generate all possible seven-letter words corresponding to that phone number and write them to a file called "words.txt".
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值